2016-10-04 1 views
-1

私が使用して、サーバー側でソケットに失敗に終わっ近くをやってる:フォアグラウンドまたはバックグラウンドでシャットダウン/クローズが実行されるのはどのような状況ですか?

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を使用してディスクリプタを手動で削除する必要があるイベントがもう必要ない場合は、

+0

FINを送信してからRSTを送信しています。どうして? – EJP

+0

@EJP - これは不合理な締め切りをしていないということですか?しかし、それは動作するようです。 – Matt

答えて

0

ソケットを閉じると、epollセットからクリアされます。しかし、警告があります。 epoll man page を参照:

> Q6 Will closing a file descriptor cause it to be removed from all 
      epoll sets automatically? 

    A6 Yes, but be aware of the following point. A file descriptor is a 
     reference to an open file description (see open(2)). Whenever a 
     file descriptor is duplicated via dup(2), dup2(2), fcntl(2) 
     F_DUPFD, or fork(2), a new file descriptor referring to the same 
     open file description is created. An open file description 
     continues to exist until all file descriptors referring to it 
     have been closed. A file descriptor is removed from an epoll set 
     only after all the file descriptors referring to the underlying 
     open file description have been closed (or before if the file 
     descriptor is explicitly removed using epoll_ctl(2) 
     EPOLL_CTL_DEL).This means that even after a file descriptor 
     that is part of an epoll set has been closed, events may be 
     reported for that file descriptor if other file descriptors 
     referring to the same underlying file description remain open. 

ので、closeが呼び出されたためにソケットに報告されたイベントの可能性があります。あなたのテストが特定のプラットフォームでうまく動作するかどうかは分かりません。もちろん、非同期I/Oとは関係ありません。

関連する問題