2

クライアントとサーバーの2つのプログラムがあります。クライアントは4バイトのASCIIコマンドを送信します

client command: BD?\r
server reads: 

サーバーコード

while(1) {

    int numbytes = 0;
    printf("MAIN: waiting for commands\n");
    memset(theRecvBuffer, '\0', THE_BUFFER_SIZE);
    numbytes = recv(theCSock, theRecvBuffer, THE_BUFFER_SIZE, 0);
    if(numbytes == 0) {
        printf("client socket closed\n");
        break;
    }
    if(numbytes == -1) {
        printf("cmd loop received socket error: %s\n", strerror(errno));
        break;
    }
}

サーバーのrecv呼び出しは4バイトを返していますが、バッファーはNULLバイトで満たされています。recv呼び出しでバッファ情報が失われる原因となるものはありますか?とにかく、printステートメントを使用してrecv呼び出しで何が起こっているかをデバッグできますか?このプログラムは別のチップセットを搭載したデバイス上にあるため、デバッガーを使用できないため、制限があります。errnoは、4バイトを返すためエラーが発生しないため、役に立ちません。

4

4 に答える 4

1

複数のスレッドを使用している場合、memset関数がメインループでバッファをゼロにする前に、別のスレッドがバッファの読み取りに失敗する可能性があります。これは単なる推測ですが、完全なコードがなければ、特定の答えを出すのは困難です。

于 2012-06-13T19:58:24.463 に答える
1

コードスニペットが実際にコードから文字通り取得されている場合(これは疑わしいです)、問題は明らかです。recvを呼び出すたびにバッファーをクリアします。4バイトを読み取ると

clear buffer
recv() = 4
not 0 (eof)
not -1 (error)
loop
clear buffer
recv() = 0
is 0 (eof)
break
loop exits with cleared buffer
于 2012-06-13T19:59:56.830 に答える
0
strace -e trace=recv -s 65535 -v -p PID

syscallの後、ユーザースペースが再びバッファを表示する前に、バッファがどのように表示されたかを表示する必要があります。は-s、キャプチャする文字列のバッファサイズです。バイナリデータの場合は、オプション-xで役立つ場合があります。

于 2012-06-13T19:42:21.340 に答える
0

私が見逃したのは、2つの異なるソケット上の2つの異なるスレッドの共有バッファーでした。

于 2012-06-14T14:28:13.703 に答える