2

私はソケットプログラミングの初心者で、送信側と受信側で異なるバッファサイズを使用してソケット経由でデータを送信すると問題が発生します。2 つの基本的なプログラム、トーカーとリスナーを作成する必要があります。標準入力に渡されたすべてのものを送信し、ソケットを介して送信する必要があり、受信者はデータを出力する必要があります。問題は、送信側と受信側で異なるバッファ サイズを使用すると、受信側で印刷されるデータが不完全または順不同になることです。理由がわかりません。

最も関連性の高いコードは次のとおりです。

聞き手:

#define BUFFERSIZE 20

...

while((numbytes = recv(new_fd, buf, BUFFERSIZE - 1, 0)) > 0) {
    buf[numbytes] = 0;
    printf("%s", buf);
}
perror("recv");

話者:

#define BUFFERSIZE 10

...

while(fgets(buffer, BUFFERSIZE , stdin) != NULL)
{
    printf("%s", buffer);
    if ((numbytes = send(sockfd, buffer, sizeof buffer, 0)) == -1) {
        perror("talker: sendto");
        exit(1);
    }
    printf("\n");
}

たとえば、次のテスト ファイルを使用します。

abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

それは印刷されます

➜  ./listener                                        
abcdefghijklmnopqrabcdefghiiz
recv: Success
abcdefghijklmnopqrr    

私が間違っているのは何ですか?

お仕事お疲れ様です!

4

1 に答える 1

2

文字列のみを送信するため、常に完全なバッファを送信する必要はなく、「文字列の長さ」のみを送信する必要があります。つまりstrlen(buffer)sizeof buffer. その後、奇妙な動作はなくなるはずです。

if ((numbytes = send(sockfd, buffer, strlen(buffer), 0)) == -1) {
...
于 2012-04-08T12:00:33.933 に答える