2012-02-02 18 views
0

私のサーバーはクライアントにパケットを送信していますが、2番目のパケットは表示されません。 私のソケットがブロック型である場合、なぜこれが起こっているのかわかりません。クライアントとサーバーの間で同期をとる方法

 while(1){ 
      memset(buf,0,1024); 
      numbytes=0; 

      if ((numbytes = recv(sockfd, buf, 1024, 0)) == -1) { 
        perror("recv"); 
        exit(1); 
       } 
      buf[numbytes] = '\0'; 
      printf("%s\n",buf); 
      fflush(stdout); 
      } 
    fclose(fp); 
    close(sockfd); 
+1

* 2回受信しようとしていますか?あなたの質問を明確にしていただけますか? – cnicutar

+0

Wiresharkは、これらの状況であなたを助ける手軽なツールです – stdcall

+0

これは、ループが2回繰り返されている間に、初めて私がサーバから2回目に送信するデータを取得したことを意味しますが、それはブロックしてデータを待つ必要がありますサーバー側から来る – tod

答えて

1

あなたのサーバーが空の文字列を送信している可能性があります。したがって、クライアントは'\0'文字を受け取ってブロックされず、空文字列なので何も印刷されません。

2番目の理由は、サーバーが接続を切断したためです。この場合、numbytesの値はゼロです。また、バッファに空の文字列があるため、クライアントは何も印刷しません。

サーバーで1,024バイト以上のデータが送信された場合、numbytesは1024と同じになり、buf[numbytes]という式は、バッファサイズが1024に等しい場合にセグメント違反となります。この問題は1024の代わりに1023を受信することによって発生します。

+0

また、データを文字列ではなくバイトとして扱うこともできます。彼はprintf( "%。* s"、numbytes、buf) 'や' fwrite(buf、1、numbytes、stdout) 'を試すことができます。 –

関連する問題