1

ここで指定されているように、ソケット接続が送信者によって正常に閉じられたときに、ネットワーク経由で値 0 を取得しようとしました。ブロックされていない呼び出しを使用すると、データが送信者から受信者に送信される前に、UDP ストリームで -1 を取得していました。元のデータが送信された後、接続を閉じたとき(ソケットをシャットダウンして送信側のソケットを閉じようとした)、ソケットが閉じられたことを示す0を取得するのではなく、-1を取得していました。誰でも助けてください。同じものを手に入れる方法はありますか。

ありがとう。

4

2 に答える 2

3

UDPソケットがclose(2)-edの場合、ソケットが-edであっても、何も送信されませんconnect(2)。一方、TCPは、4方向接続のティアダウンを開始します。これら2つのケースを混同しているようです。

于 2012-11-28T15:21:04.160 に答える
1

シャットダウンに関する UNIX の man ページに、次のように記載されています。

戻り値:

成功すると、ゼロが返されます。エラーの場合は -1 が返され、errno が適切に設定されます。

エラー:

EBADF - sockfd は有効な記述子ではありません。
ENOTCONN - 指定されたソケットが接続されていません。
ENOTSOCK - sockfd はソケットではなくファイルです。

また、Windows プラットフォームまったく同じです。

戻り値

エラーが発生しない場合、shutdown は 0 を返します。それ以外の場合は、SOCKET_ERROR の値が返され、WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。

つまり、UDP は接続指向のプロトコルではなく、そのための connect() 呼び出しは、関連付けがまったく確立されていることを意味するものではありません。

私の推測では、実際には ENOTCONN エラー (Windows の場合は WSAENOTCONN) が発生しています。errno (または Windows の場合は WSAGetLastError()) を確認してください。

于 2012-11-28T15:05:07.540 に答える