を行っているため、ソケットのデータが失わclose()
れています。
Linux 固有のshutdown()
マンページは役に立ちません。
shutdown() 呼び出しにより、sockfd に関連付けられたソケットの全二重接続のすべてまたは一部がシャットダウンされます。SHUT_RD の場合、それ以上の受信は許可されません。SHUT_WR の場合、それ以上の送信は許可されません。SHUT_RDWR がどのようになっている場合、それ以上の受信と送信は許可されません。
Microsoft のMSDNの方がはるかに優れていますが、Windows 固有であるため、Linux との間には違いがあります。
接続されたソケットが閉じられる前にすべてのデータが送受信されるようにするには、アプリケーションは、closesocket を呼び出す前に shutdown を使用して接続を閉じる必要があります。リモート エンドがすべてのデータを送信し、正常な切断を開始したという通知を待機する 1 つの方法は、次のように WSAEventSelect 関数を使用します。
1. Call WSAEventSelect to register for FD_CLOSE notification. 2. Call shutdown with how=SD_SEND. 3. When FD_CLOSE received, call the recv or WSARecv until the function completes with success and indicates that zero bytes were received. If SOCKET_ERROR is returned, then the graceful disconnect is not possible. 4. Call closesocket.
私の質問
- Linux では、待機
FD_CLOSE
(ステップ 1) に相当するものは何ですか?
Windows での動作について質問していると思われる回答やコメントが寄せられています。Linux での動作について質問しています。Linux のマンページよりもはるかに明確で完全な Windows のドキュメントを参照しているだけです。