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