2017-01-11 8 views
-1

私はソケットC#で作業しています。ソケットを使用してクライアントサーバーアプリケーションを実装しましたが、問題はクライアントがサーバーから送信されたすべてのデータを受信しないことです。ソケットtcpのすべてのデータを受け取っていません

ここにクライアントアプリケーションコードがあります。サーバーから送信されたすべてのデータを受信するためにはどうすればよいですか?

strRecieved = ""; 
Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9001); 
soc.Connect(endPoint); 
byte[] msgBuffer = Encoding.Default.GetBytes(msgToberecieved); 
soc.Send(msgBuffer, 0, msgBuffer.Length, 0); 
byte[] buffer = new byte[2000]; 
int rec = soc.Receive(buffer); 

strRecieved = String.Format(Encoding.Default.GetString(buffer)); 
+0

"クライアントはすべてのデータを受信しません"あなたは何を受け取ると思われますか?何を受け取ったのですか?どのくらいの大きさの 'バッファ'ですか? –

+0

重複:http://stackoverflow.com/questions/41588439/client-server-socket-c-sharp – jdweng

+0

[クライアントサーバーソケットC#]の重複している可能性があります(http://stackoverflow.com/questions/41588439/client-server -socket-c-sharp) – FakeCaleb

答えて

0

TCPは、データグラムプロトコルではなく、ストリーミングプロトコルです。これは、複数の受信呼び出しでデータが分割される可能性があることを意味します。 1回の受信通話で複数のパケットを受信することも可能です。

したがって、データの長さを定義するパケットフレームが必要です。例えば

はsignatue(UINT)およびデータ長(UINT)(SO合計8バイト)とヘッダを作成します。データをフォローアップする。 (xバイト)

  • まず、ヘッダーのサイズを取得するまでデータを受信し続けます。 (8バイト)
  • まだパケットと整列している場合は、署名を確認してください。 (あなたのケースではマジックナンバーを入力してください)
  • isが受信バッファの上限を超えない場合は、長さの値を確認してください。
  • は、すべてのデータを受信するまでデータを受信し続けます。
  • データを処理します。
  • リピート。

あなたがBitConverterまたはBinaryReader


を使用することができ、データを解析するために、あなたが 'STOP' 記号を持ってまで、別の可能性は、データを読んでいます。たとえば、EOLまたはEOFなど

+0

私のコードをたくさん更新するのを助けてください – user7394882

関連する問題