poll

pollは、複数のファイルディスクリプタを監視するUNIXシステムコール・・・。

Man page of POLL

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