1

Socket.Disconnect()メソッドを使用せずにソケットからすべてのバイトを受信するタイミングを知りたいですか?

それでも、私はこのコードを使用してすべてのバイトを受信しますが、Scoket.Send(byte [])メソッドが完了したときにSocket.Disconnect()メソッドを使用します。

List<byte> LBytes = new List<byte>();
do
{
System.Threading.Thread.Sleep(50);
BytesRead = obj_socket.Receive(obj_buffer, 0);
LBytes.Append(obj_buffer);
} while (BytesRead != 0);

ソケットを切断すると、ソケットは0バイトを読み取るためです。たとえば、100,000バイトを送信した場合、100,000バイトを受信する必要があります。どのようにこれを行いますか?

4

1 に答える 1

3

ソケットが開いている間は、最後に到達したときにソケットをブロックせずにこれを行う方法はありません(より多くのデータが必要です)。

それを行うにはいくつかの方法があります。

  • 送信後、ソケットを閉じます
  • 「メッセージの終わり」を意味するマーカーがあります(エンコードされたテキストで十分簡単です-0一般的な選択ですが、任意のバイナリデータを送信する場合は注意が必要です)
  • データの前に長さのプレフィックス(この場合は100,000)を送信し、その量を取得したら読み取りを停止します

NetworkStreamたとえば、長さプレフィックスを使用した場合:

int expecting = //TODO: read header in your chosen form
int bytesRead;
while(expecting > 0 && (bytesRead = stream.Read(buffer, 0,
        Math.Min(expecting, buffer.Length))) > 0)
{
    // TODO: do something with the newly buffered data
    expecting -= bytesRead;
}
于 2011-02-21T11:03:20.107 に答える