TCP - Socket - Read Problem

06/08/2008 - 20:45 von Sandra Baum | Report spam
Hallo,

ich habe ein Problem und bin mir nicht sicher.
Die Daten kommen leider nicht aufeinmal, so dass ich abpollen muss.
Das ganze muss ich aber haben.
Ist das richtig?

System.Array.Copy( arrResponse, 0, arrResult, 0 + nCount,
numberOfBytesRead );

Ich muss es dann nochmals verschieben.
sResp = System.Text.Encoding.ASCII.GetString( arrResult, 4,
arrResult.Length - 4 );

Danke für Tipps.

Grüße
Sandra




if ( true == XML_NetworkStream.CanWrite )
{
XML_DataAvailable();
XML_NetworkStream.Write( arrRequest, 0, arrRequest.Length );
if ( true == bResponse )
{
byte[] arrResponse = new byte[64 * 1024];
//int nCount = XML_NetworkStream.Read( arrResponse, 0,
arrResponse.Length );
//arrResult = new byte[nCount];
//System.Array.Copy( arrResponse, arrResult, nCount );
// ** neu *****************
if ( XML_NetworkStream.CanRead )
{
int nCount = 0;
int numberOfBytesRead = 0;
myCompleteMessage = new StringBuilder();

// Incoming message may be larger than the buffer size.
do
{
numberOfBytesRead = XML_NetworkStream.Read(
arrResponse, 0, arrResponse.Length );
arrResult = new byte[numberOfBytesRead];
myCompleteMessage.AppendFormat( "{0}",
Encoding.ASCII.GetString( arrResponse, 0, numberOfBytesRead ) );
System.Array.Copy( arrResponse, 0, arrResult, 0 +
nCount, numberOfBytesRead );
nCount += numberOfBytesRead;
}
while ( XML_NetworkStream.DataAvailable );
}
else
{
// TODO
arrResult = new byte[0];
}
// *************************
}
else
arrResult = new byte[0];
}


sResp = "";
if ( bResponse == true )
{
sResp = System.Text.Encoding.ASCII.GetString( arrResult, 4,
arrResult.Length - 4 );
//sResp =
System.Text.Encoding.ASCII.GetString(myCompleteMessage, 4,
myCompleteMessage.Length - 4 );
}
 

Lesen sie die antworten

#1 Peter Brightman
07/08/2008 - 13:12 | Warnen spam
Sandra Baum schrieb:
Hallo,

ich habe ein Problem und bin mir nicht sicher.
Die Daten kommen leider nicht aufeinmal, so dass ich abpollen muss.



Ist meistens so.

Das ganze muss ich aber haben.



Das sollst Du auch.

Ist das richtig?



Wozu arrResponse[] und arrResult[] ?

Also in Deinem Code machst Du nochmals ein zweites Array, welches die
tatsàchliche Größe der empfangenen bytes als Dimension hat. Da in dem
Aufruf Read() das Zielarray sowie die Größe des Zielarrays angegeben
wird, liest die Read() Methode natürlich nicht über die Array-Grenze
hinaus. Da Du die empfangenen bytes dann sowieso in einem StringBuffer
ablegst, verstehe ich nicht wozu Du das zweite Array brauchst, welches
ja nie größer als das Zielarray sein kann. In dem Falle (so wie es in
dem Kommentar im code steht) dass mehr Daten da sind als dein Zielarray
groß ist hast Du ja die Schleife, wenn dies so ist dann holst Du bei dem
nàchsten Read() z. B. den Rest ab, und diesen Rest hàngst Du ja wieder
mit Append() an den StringBuffer.

Mir erscheint es wichtiger dass Du erkennst wo eigentlich die Message
komplett sein wird, also das Erkennen des Endes. Hier solltest Du
eigentlich immer deinen StringBuffer durchsuchen und wenn dann die Daten
komplett sind, diese per event zu einem consumer senden und dann den
StringBuffer wieder leeren.

Anstatt ...AppendFormat( "{0}", Encoding.ASCII.GetString(.. kannst Du
auch ...Append(Encoding.ASCII.GetString(.. benutzen, ist daselbe.

hth

Gruß,
Peter

Ähnliche fragen