5.5 listen()
---誰かコールしてくれない?
よし、気分転換の時間です。リモートホストに接続したくない場合はどうすればいいのでしょう。例えば、接続が来るのを待ち、何らかの方法でそれを処理したいとします。この処理は2段階です。まず listen()
を行い、次に accept()
を行います(後述)。
listen()
の書式はかなり単純ですが、少し説明が必要です。
int listen(int sockfd, int backlog);
sockfd
は socket()
システムコールから得られる通常のソケットファイル記述子です。backlog
は、受信キューで許可される接続の数です。これはどういう意味でしょうか?着信した接続は、accept()
(後述)するまでこのキューで待機することになりますが、このキューに入れることができる数の上限を表しているのです。ほとんどのシステムでは、この数を黙って約 20 に制限しています。おそらく、5
や 10
に設定しても大丈夫でしょう。
ここでも、いつものように listen()
はエラー時に -1
を返し、errno
をセットします。
さて、想像がつくと思いますが、サーバが特定のポートで動作するように listen()
を呼び出す前に bind()
を呼び出す必要があります。(どのポートに接続するかを仲間に伝えることができなければなりません!)ですから、もし接続を待ち受けるのであれば、一連のシステムコールは次のようになります。
getaddrinfo();
socket();
bind();
listen();
/* accept() goes here */
かなり自明なので、サンプルコードの代わりに置いておきます。(以下の accept()
の章のコードはより完全なものです。)この全体の中で本当に厄介なのは、accept()
の呼び出しです。