2012-04-03 12 views
1

MSDNは次のように述べています: "lenパラメータを0にして呼び出しを送信すると、実装が成功したとして扱われます。このような場合、sendは0を有効な値として返します。長さのトランスポートデータグラムが送信されます。winsock blocking send()はどのような条件で0を返しますか?

私の質問は、lenパラメータがゼロでない場合、ブロッキングsend()は0を返します(タイムアウトが設定されていないと仮定します)。

私はまた、インターネットを検索し、次を発見した:

http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

「Winsockの下では、SIGPIPE/EPIPEの機能は全く存在しません(送信)通常の接続解除のために0を返します。どちらか異常切断の場合は-1を返します。

しかし、関係なく、私が試したどのように、私は「通常の接続解除」をシミュレートすることができなかったので、私は(センドを持っていることができませんでした)事前に0

感謝を返します。

答えて

0

「正常な」切断は、受信側が接続終了時にclosesocket()を呼び出してFINパケットを送信側に送信するときです。 send()FINを検出すると、接続が正常に切断されたことがわかり、コードに通知するために0が返されます。

+0

FINを受信して​​もsend()は成功します。 FINは、closesocket、shutdown(SD_SEND)、shutdown(SD_BOTH)によって発生する可能性があります。 シャットダウン(SD_SEND)のケースでは、相手側(シャットダウン(SD_SEND)を呼び出した側)がそれ以上のデータを受信するため、後続のsend()は常に成功します。ただし、recv()の呼び出しは0を返します。 closesocketとshutdown(SD_BOTH)(およびshutdown(SD_RECEIVE))では、最初のsend()も成功します。ただし、RSTが返されます。次回send()またはrecv()が呼び出されると、SOCKET_ERROR(-1)が返されます。 – JohnTang

+0

要約すると、FINの原因にかかわらず、send()は成功する(FIN​​を受信した後の最初の呼び出し)か、RST(-1回目以降の呼び出し)のため-1を返します。 つまり、ブロッキングsend()は決して0を返しませんか?右? (タイムアウトが設定されていないと仮定して) – JohnTang

関連する問題