5.5 listen()---誰かコールしてくれない?

よし、気分転換の時間です。リモートホストに接続したくない場合はどうすればいいのでしょう。例えば、接続が来るのを待ち、何らかの方法でそれを処理したいとします。この処理は2段階です。まず listen() を行い、次に accept() を行います(後述)。

listen() の書式はかなり単純ですが、少し説明が必要です。

int listen(int sockfd, int backlog);

sockfdsocket() システムコールから得られる通常のソケットファイル記述子です。backlog は、受信キューで許可される接続の数です。これはどういう意味でしょうか?着信した接続は、accept()(後述)するまでこのキューで待機することになりますが、このキューに入れることができる数の上限を表しているのです。ほとんどのシステムでは、この数を黙って約 20 に制限しています。おそらく、510 に設定しても大丈夫でしょう。

ここでも、いつものように listen() はエラー時に -1 を返し、errno をセットします。

さて、想像がつくと思いますが、サーバが特定のポートで動作するように listen() を呼び出す前に bind() を呼び出す必要があります。(どのポートに接続するかを仲間に伝えることができなければなりません!)ですから、もし接続を待ち受けるのであれば、一連のシステムコールは次のようになります。

getaddrinfo();
socket();
bind();
listen();
/* accept() goes here */

かなり自明なので、サンプルコードの代わりに置いておきます。(以下の accept() の章のコードはより完全なものです。)この全体の中で本当に厄介なのは、accept() の呼び出しです。