1

ソケットを使用して単純な SNPP (Simple Network Paging Protocol) クライアントを作成しようとしています。サーバー間のわずかな不一致を除いて、すべてがうまく機能しているようです。

コマンドを送信すると、通常は単一のデータ チャンクである応答を読み取る必要があります。ただし、Sprint の SNPP サーバーは 2 つの部分で応答を送信します。データの最初のチャンクは、ステータス コードの最初の桁です。2 番目のチャンクは残りです。たとえば、「220 Gateway ready」という返信を受信しようとすると、次のように届きます。

2

残りを取得するには、別の空のコマンドを送信する必要があります。

20 Gateway ready

今のところ、私は使用しています:

byte[] buffer = new byte[256];
socket.Receive(buffer);

コマンドを発行した後、データのチャンクごとに個別のバッファを割り当てずに、利用可能なすべてのデータを確実に受信するにはどうすればよいですか?

4

5 に答える 5

4

チャンクされた応答については、次のようにデータを読み取ることをお勧めします。

using (var resultStream = new MemoryStream())
{
    const int CHUNK_SIZE = 2 * 1024; // 2KB, could be anything that fits your needs
    byte[] buffer = new byte[CHUNK_SIZE];
    int bytesReceived;
    while ((bytesReceived = socket.Receive(buffer, buffer.Length, SocketFlags.None)) > 0)
    {
        byte[] actual = new byte[bytesReceived];
        Buffer.BlockCopy(buffer, 0, actual, 0, bytesReceived);
        resultStream.Write(actual, 0, actual.Length);
    }

    // Do something with the resultStream, like resultStream.ToArray() ...
}
于 2009-05-03T08:21:59.500 に答える
1

Socket.Available プロパティを確認して、Receive を再度呼び出す必要があるかどうかを判断してください。

于 2009-05-03T05:18:37.053 に答える
0

私はあなたの質問を理解していると思います。このSocket.Receiveのオーバーロードにより、データの配置を開始するオフセット位置を指定する整数を渡すことができます。例のように最初の呼び出しで 1 バイトを取得した場合、このオーバーロードをオフセット 1 で呼び出し、同じバッファーを使用できます。

于 2009-05-03T05:28:09.790 に答える
0

Socket.Receive受信したバイト数を整数で返します。これが 1 かどうかを確認して、Receiveもう一度呼び出すことができます。

byte[] buffer = new byte[256];
int len = socket.Receive(buffer);

if (len == 1)
  socket.Receive(buffer, 1, buffer.Length - 1, SocketFlags.None);
于 2009-05-03T06:23:12.810 に答える