2

このループは、ソケットから行ごとにデータを取得し、それをバッファーに入れることになっています。何らかの理由で、返す新しいデータがない場合、recv は取得した最後の数行を返します。最初の recv をコメントアウトすることでバグを止めることができましたが、次の行の長さがわかりません。私はそれがではないことを知っています

while(this->connected){
    memset(buf, '\0', sizeof(buf));
    recv(this->sock, buf, sizeof(buf), MSG_PEEK);           //get length of next message
    ptr = strstr(buf, "\r\n");
    if (ptr == NULL) continue;
    err = recv(this->sock, buf, (ptr-buf), NULL);    //get next message

    printf("--%db\n%s\n", err, buf);

    tok[0] = strtok(buf, " ");
    for(i=1;tok[i-1]!=NULL;i++) tok[i] = strtok(NULL, " ");

//do more stuff
}
4

4 に答える 4

1

2番目のrecvの長さに2を追加する必要があったので、「\ r\n」を使用します。それ以外の場合は、最初の「\ r \ n」が表示され、最後の行がbuf[0]であると見なされます。

于 2010-04-28T10:14:31.060 に答える
1

マニュアルには次のように記載されています。

MSG_PEEK このフラグにより​​、受信操作は、キューからデータを削除せずに、受信キューの先頭からデータを返します。したがって、後続の受信呼び出しは同じデータを返します。

したがって、正しい動作を得ていると思いますが、おそらく何か他のものを期待しています。

于 2010-04-28T09:15:49.093 に答える
1

あなたの問題は、MSG_PEEK で recv を使用する場合、"HELLO\r\nHELLO\r\n" のように 2 行が既に存在する場合、recv にバッファーのサイズ全体を与えることです。

ptr は最初の \r\n を指し、(ptr - buff) を指定して recv を呼び出します。これにより、recv は最初の HELLO のみを buf に読み取りますが、既にその情報を buff に読み取っているため、2 つを処理します。 \r\nHELLO\r\n をキューに残します。完全に読んでいないためです。

次にそれをのぞいてみると、既に処理した情報がぶら下がっていて、データが繰り返されていると思い込んでしまいます。

(私がこれを十分に明確に書いたことを願っています。これは非常に紛らわしいバグです:)

于 2010-04-28T09:35:17.040 に答える