括弧 () を追加するのを忘れた場合は、書き直してください。
if( data=recvfrom(sd, file_buffer, sizeof(file_buffer), 0, (struct sockaddr *) &server, &server_length)<0 )
理由:
の優先順位<
が高いため、最初に実行され=
た if() で、この原因は、データが正常に読み取られたときとエラーが返されたときに
割り当てられます。
look @ C 演算子の優先順位表<
=
data
0
1
recvfrom()
-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
たが、コードの他の部分で間違いを犯していないことを確認してください 。