pollは、複数のファイルディスクリプタを監視するUNIXシステムコール・・・。
select同様に、複数のファイルディスクリプタを監視して、マルチセッションできるようにするわけだが、こちらの場合はpollfd構造体の配列を使う・・・。
このように、pollfd構造体の要素数6の配列fdsを用意し、ここにファイルディスクリプタや状態を表す値が格納される・・・。
fdsの0番目のfdをsoc、eventsにはPOLLIN | POLLERRをセット、それ以外の各要素のfdを-1で初期化・・・。
pollにfds, count + 1, -1を渡す・・・。
第3引数にはタイムアウトする秒数を渡すのだが、今回はタイムアウトなしとするので-1としている・・・。
pollの戻り値が、負の値や、0でない場合は、fdsのrevents要素とPOLLINとの論理積の真偽で状態変化したかを判定する・・・。
0番目なら、新しいクライアントの接続があった場合だから、アクセプトしてファイルディスクリプタを1から5までの空いている場所のどこかに格納・・・。監視対象にする・・・。
1番目以降なら、既存のアクセプトソケットなので、データの送受信をする・・・。
クライアントその1
$ ./connect hostname: localhost port: 3000 connect success. >hoge hoge >ABC ABC >
クライアントその2
$ ./connect hostname: localhost port: 3000 connect success. >foobar foobar >XYZ XYZ >
実際の時系列ではhoge → foobar → ABC → XYZ
と交互に入力しているのだが、サーバ側では、
$ ./poll soc = 3 setsockopt(SO_REUSEADDR) success. bind success. listen success. accept!(IPAddress = 127.0.0.1, Port = 36447) hoge accept!(IPAddress = 127.0.0.1, Port = 36540) foobar ABC XYZ
このように交互に送られているのがわかる・・・。
pollでもマルチセッション・・・。
Sample/poll.c at master · bg1bgst333/Sample · GitHub
Sample/connect.c at master · bg1bgst333/Sample · GitHub