2012-04-08 12 views
2

私はソケットプログラミングに関する初心者です。送信側と受信側で異なるバッファサイズを使用してソケットを介してデータを送信すると問題が発生します。 私は2つの基本的なプログラム、話者、リスナーを作らなければなりません。 1つは、渡されたすべてをstdinに送信し、ソケットで送信し、受信者はデータを出力する必要があります。 問題は、送信側と受信側で異なるバッファサイズを使用すると、受信側によって印刷されるデータが不完全であるか、順不同であることです。なぜ私は理解できないのですか?sendとrecvのバッファサイズが異なる場合の問題

リスナー:

#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  

それは私が間違ってやっていることは何ですかを印刷するのでしょうか?

ありがとうございます!

+1

MAXBUFLENの値は何ですか? –

+0

それは間違いでした:BUFFERSIZEであったはずです。ありがとう:) –

答えて

2

あなただけの文字列を送信しているので、あなたは常に完全なバッファを送るべきではありませんが、唯一の「文字列の長さ」、すなわちstrlen(buffer)の代わりsizeof bufferを使用しています。その後、奇妙な行動はなくなるはずです。

if ((numbytes = send(sockfd, buffer, strlen(buffer), 0)) == -1) { 
... 
+0

いいね。奇妙な行動が消えたようだ! –

+0

ありがとう!あなたは奇妙な行動を理解していますか? –

+0

完全なバッファを常に送信します。間にゼロを設定することはありません。奇妙な振る舞いは、例えば、バッファ内に残ったアーティファクトによって引き起こされる可能性があります。あなたは 'send()'の後に 'bzero(buffer、BUFFERSIZE);を挿入しようとすることができます。これはまた、奇妙な動作を修正する必要があります。 – diewie

関連する問題