0

現在、ソケットプログラミングを行っています。これで、クライアント サーバー間でバイトを簡単に送受信できるようになりました。今、クライアントサーバー間で文字列を送信したいと思います。

私が同じために使用したコードは(クライアント)です:

    strcpy(recvbuf, sendbuf);
    send(ConnectSocket, recvbuf, strlen(recvbuf), 0);
    printf("\nSending string...");   

(サーバ)

    iResult = recv(ClientSocket, recvbuf, sizeof(recvbuf) -1, 0);
    recvbuf[iResult]= '\0';
    strcpy(sendbuf2, recvbuf);
    printf("String recieved = %s", sendbuf2);

しかし、それは正しい結果を示していません。私を助けることができるリンクはありますか?

4

3 に答える 3

0

recv() が誤用されていると思います。

  1. recv() の戻り値を確認する必要があります。戻りコードが負の場合、残りの行を進めるべきではありません。
  2. recv() の正の値を取得するには、フラグ (最後の引数) を設定する必要があります。「0」は、「sizeof(recvbuf) -1」を指定した長さのすべてのバイトを受信することを意味します。そのため、1023 バイトすべてを受信するまでコードは返されません。
  3. ソケット内のバイト数を特定し、正確なバイト長を読み取ります。

これを試して...

int length_to_read = 0;

length_to_read = recv(ClientSocket, recvbuf, sizeof(recvbuf) -1, MSG_PEEK);
if( length_to_read < 0 ) {
  // error
  return;
}

iResult = recv(ClientSocket, recvbuf, length_to_read, 0);
if( iResult < 0 ) {
  // error
  return;
}

PS。上記のコードは冗長な recv() システム コールです。一般的な TCP/IP ソケット プログラミングでは、データの正確な長さを知っておく必要があります。たとえば、長さと後続データの最初の 4 バイト。c/s インターフェイスの長さを定義しないのはなぜですか?

ステップ 1. データのサイズを計算します。ステップ 2. 長さとデータを送信します。

ステップ 1. 長さの 4 バイトを読み取ります。ステップ 2. データの正確な長さを読み取る前に計算された長さ。

于 2013-04-22T10:51:09.240 に答える
0

まず文字列もバイトです。文字列を送受信するのと同じように、簡単にバイトを送受信できる限り。

もう少しヒント。使用している TCP または UDP に注意する必要があります。UDP では、各 send() がパケットを送信し、recv() がパケットを 1 回受信します。ただし、tcp はバイト ストリームです。つまり、 send() はストリームに数バイトを書き込むだけであり、 recv() が実際に受け取るバイト数は、返されるまで期待できません。バイトストリームからパケットをデコードするメカニズムを設計する必要があります。たとえば、「\0」を使用して文字列パケットを分割できます。

于 2013-04-22T08:33:04.197 に答える