私が使用して、サーバー側でソケットに失敗に終わっ近くをやってる:フォアグラウンドまたはバックグラウンドでシャットダウン/クローズが実行されるのはどのような状況ですか?
s
私は閉じてるソケットです
struct linger so_linger;
so_linger.l_onoff = 1;
so_linger.l_linger = 0;
setsockopt(s, SOL_SOCKET, SO_LINGER, &so_linger, socklen_t)sizeof(so_linger));
shutdown(s, SHUT_WR);
close(s);
。
問題は発生しましたが、時々問題が発生し、一部のサーバーに影響するように見えます。いくつかはUbuntu上で実行されているものと、CoreOS上で実行中のものがあります。 CoreOSではうまく動作します。
Ubuntuでは、closeコールしているにも関わらず、ソケットに関するepoll_waitからイベントを取得しています。
私はこれがすぐに起こると仮定しました。しかし、非ブロッキングI/Oを使用している場合はそうでないかもしれないと思います。
これは、epoll_waitのイベントが、破損したものを指し示すev.data.ptr値セットを持つことを意味します。
これは本当ですか?半分閉じてもepollからイベントディスクリプタが削除されず、シャットダウンは非ブロッキングI/Oと同期しません。
したがって、私が実際にEPOLL_CTL_DELを使用してディスクリプタを手動で削除する必要があるイベントがもう必要ない場合は、
FINを送信してからRSTを送信しています。どうして? – EJP
@EJP - これは不合理な締め切りをしていないということですか?しかし、それは動作するようです。 – Matt