2016-09-29 6 views
1

以下のコードは、Socketを使用してデータを受信して​​います。ソケットでデータを受信する際の未知のバイトサイズの扱い

ここで問題となるのは、バイトサイズを期待された量に初期化する必要があります。それ以外の場合、期待どおりの結果が得られません。

try 
{ 
    byte[] byt = new byte[256]; // Byte size should be intialize as expected 
    clientSocket.ReceiveTimeout = 10000; 
    clientSocket.Receive(byt); 
    String msg = Encoding.UTF8.GetString(byt); 
    Console.WriteLine("Message" + msg); 
}catch (SocketException e){ 
    if (e.SocketErrorCode == SocketError.TimedOut){ 
     Console.WriteLine("SocketException: Timeout"); 
    }else{ 
     Console.WriteLine("SocketException: " + e.ToString()); 
    } 
}catch (Exception e){ 
    Console.WriteLine("Exception: " + e.ToString()); 

} 

したがって、データの受信時に不明なサイズのバイトを処理するにはどうすればよいですか?

+2

データの受信をいつ停止するのか分かりますか?ストリームの最後まで読もうとしていますか? 「それはテキストデータの終わりです」というデリミタがありますか?私たちは実際にプロトコルについて知る必要があります... –

+0

ClientSocket.Receiveはintを返します - あなたが受け取ったデータの量を知っていますか? – BugFinder

+0

@ JonSkeet - 実際には、表示するデリミタはありません。これは、可能であればテキストデータの最後です。サーバが "こんにちは"と言う場合、文字列ベースの最後を追加せずに正確な "hello"を受信したいとしましょう。 –

答えて

0

送信者を制御できる場合は、あなたは、あなたのパッケージの先頭にサイズを追加送信するために

byte[] buffer = new byte[4]; 
    ClientSocket.Receive(buffer); 
    int length = BitConverter.ToInt32(buffer, 0); 
    buffer = new byte[length]; 
    ClientSocket.Receive(buffer); 

を使用することができ、拳4バイトであなたのパッケージのサイズを渡し、受信するためのint型

にそれを変換することができ

BitConverter.GetBytes(buffer.Length) 
関連する問題