0

UDP ソケットを介してテキスト ファイルを受信しようとしています。クライアントは正常にビルドされますが、空白のコンソールが表示されます。いくつかの実験の後、問題は受信にあることがわかったので、コードのその部分を投稿します。

size_t data=0;
if(data=recvfrom( sd, file_buffer, sizeof(file_buffer), 0
                , (struct sockaddr *) &server, &server_length) < 0)
{
  printf("Error receiving file.");
  exit(1);
}

if(data==sizeof(file_buffer))
{
  printf("Received Data:[%s]",file_buffer);
}
4

1 に答える 1

3

括弧 () を追加するのを忘れた場合は、書き直してください。

if( data=recvfrom(sd, file_buffer, sizeof(file_buffer), 0, (struct sockaddr *) &server, &server_length)<0 )

理由:
の優先順位<が高いため、最初に実行され=た if() で、この原因は、データが正常に読み取られたときとエラーが返されたときに 割り当てられます。 look @ C 演算子の優先順位表<=data01recvfrom()-1

あなたのコードは、正常に読み取られるための機器です:

if(data = 1 < 0)

recvfrom()失敗すると次のようになり ます。

if(data = -1 < 0) 

間違い?実際には、 () 括弧を忘れました (または、わからない場合は追加する必要があります)。

if( (data=recvfrom(sd, file_buffer, sizeof(file_buffer), 0, (struct sockaddr *) &server, &server_length)) <0 )

次のように () を追加したのを参照してください。

if( (data = recvfrom() ) < 0) 
    ^                  ^  added in your code 

編集

2 番目のエラー:「バッファが\0終了していません」

関数recvfrom()が正常に機能した場合、メッセージまたはデータグラムの長さをバイト単位で返します。また、ファイル終了条件を受信した場合、または接続が閉じられた場合は、0が返されます。

注意すべきことは、バッファを終了するためにシンボルを配置しないことです。'\0''%s'また、実行時に未定義の動作を引き起こす null で終了する文字列を除く のコンテンツを印刷するために使用してfile_buffer[]います (また、セグメンテーション違反が発生しない場合は、コンソールに異常なシンボルが表示される場合があります)。

ファイル バッファを文字列として使用する場合は、常に of の 1 つ未満を読み取り、 sizeof(file_buffer)null を明示的に設定する必要があります。\0

次のようにすることをお勧めします。

no_Of_bytes =recvfrom( 
                sd, 
                file_buffer, 
                sizeof(file_buffer) - 1, 
                0,
                (struct sockaddr *) &server, 
                &server_length
            );
file_buffer[no_Of_bytes] = '\0';

file_bufferで使用できるようになりまし%sたが、コードの他の部分で間違いを犯していないことを確認してください 。

于 2013-04-06T06:09:37.750 に答える