2017-12-13 14 views
0

のは、私がリスニングソケットを作成したとしましょう:受け入れイベントでepollを実行することはできますか?

sock = socket(...); 
bind(sock,...); 
listen(sock, ...); 

それが着信接続を待機する靴下上のイベントがepoll_waitを行うことは可能ですか?その後、クライアントのソケットfdを取得するにはどうすればよいですか?

私はソケット用に書いているのは非ブロッキングではありませんが、epollの実装でタイムアウトが働いています。接続を受け入れて、それを単一のスレッドで処理して、何かがうまくいかずに接続できない場合は、ハングアップします。

+1

はい、あなたはnon_blockingモードにソケットを設定する必要があります。 //stackoverflow.com/questions/29729561/asynchronous-c-client-for-a-multiclient-c-server –

+1

ノンブロッキングは必要ありません。リッスンソケットが*読み込み可能であることをポーリングするだけです。 –

答えて

0

この非標準プラットフォームが何であるかわからないと、彼らがepoll呼び出しに与えたセマンティクスを正確に知ることは不可能です。しかし、Linuxの標準epollでは、着信接続が到着したときにリスニングソケットが「読み取り可能」と報告され、acceptを呼び出すことで接続を受け入れることができます。ソケットをブロッキングモードのままにして、それぞれの呼び出しがacceptになる前に、epollのレベルトリガーモードを使用して可読性をチェックすると、このになるはずです - 接続が到着しなかったときに何とかaccept 、あなたは立ち往生します。たとえば、リスニングソケットを共有しているプロセスが2つあり、両方が同じ接続のacceptに接続しようとすると、これが発生します。または、着信接続が到着した後に再度閉じると、acceptに電話をかけることがあります。 (この場合、Linuxはまだacceptを成功させることができますが、この種のエッジケースは私が奇妙なことをする奇妙なプラットフォームを疑っている場所です)。これらのことをチェックしたいと思うでしょう。

最悪の場合、acceptは何も受け入れないことを報告しているので、非ブロックモードははるかに信頼性が高いです。しかし、それが利用できない場合、あなたはこのようなものを取り除くことができるかもしれません...

関連する問題