16

accept()ブロッキング ソケットで呼び出しを中断する方法を探しています。これはライブラリにあることを意図しており、ユーザーシグナルを乱雑にしたくないため、シグナルを使用することはオプションではありません。使用select()は別のオプションですが、さまざまな理由で、私の場合はあまり魅力的ではありません。

可能であれば、ソケットが呼び出しでブロックされている間に、別のスレッドから( fcntl()and を使用して) ソケットを非ブロック モードに設定するとうまくいきます。予想される動作は、呼び出しがorで返されることです。O_NONBLOCKaccept()accept()EAGAINEWOULDBLOCKerrno

それは本当にそのように機能しますか?安全ですか?ポータブル?

WSAIoctl()この方法の Windows への適用可能性 (およびを使用する必要がある場合FONBIO) について知っている場合は、私も興味があります。

4

2 に答える 2

11

Windowsについてはわかりませんが、必要な動作はPOSIXによって保証されています:

リッスン キューに接続要求がなく、ソケットのファイル記述子に O_NONBLOCK が設定されていない場合、accept() は接続が存在するまでブロックされます。listen() キューに接続要求がなく、ソケットのファイル記述子に O_NONBLOCK が設定されている場合、accept() は失敗し、errno を [EAGAIN] または [EWOULDBLOCK] に設定します。

ソース: http://pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html

また、読み取りセット内のリッスン ソケットをポーリングすることにより、着信接続を確認するために使用することもできますselectpoll

于 2012-10-12T15:09:06.260 に答える
0

質問では、IOの多重化に最適な方法であるselect(またはpollまたはepoll)を使用したくないと言っています。これは悪い考えですが、ソケットをリッスンするためだけに別のスレッドを使用することをお勧めします!

于 2020-03-28T21:25:27.400 に答える