select()を使ったプログラム

  概要   プログラム   解説

select()を使ったプログラムの解説

サーバへの接続

connect()するまでは、 単純なクライアントプログラムと同じです.

多重同期入出力の処理

connect()後はユーザの標準入力とサーバに接続した ソケットからの入力があります。 これらの2つの入力からデータが入ってきた時点で それぞれを処理するには以下のようにします。

  FD_ZERO(&readmask);
  do {
    FD_SET(0,&readmask);
    FD_SET(s,&readmask);

    select(s+1,&readmask,NULL,NULL,NULL);

    if (FD_ISSET(0,&readmask)) {
	ユーザからの入力があった場合の処理

    } else if (FD_ISSET(s,&readmask)) {
	socketから入力があった場合の処理

    } 
  } while(...);

readmaskには入力があることを確認したいファイル記述子を 指定します.この変数のセットはFD_SET()を使います. このプログラムでセットするのは標準入力を表す0とソケットのsです。 最初の引数にはチェックするファイル記述子の一番大きな数値+1を 指定します.ここでは一番大きなファイル記述子はsなので's+1'とします

そして、このreadmaskを引数にしてselect()を呼び出します. すると、select()はreadmaskで指定されたファイル記述子の いずれかから入力があるまで待ち、入力があったら、制御を戻します.

制御が戻ってきたらFD_ISSET()でどこから入力があったかを調べて, 必要な処理をします。

必要であればselect()では5番目の引数でタイムアウトを設定できます. 以下に例を示します.

  struct timeval timeout;
  timeout.tv_sec = 5;
  timeout.tv_usec = 0;
  if (select(s+1,&readmask,NULL,NULL,&timeout) ==  0)
    break;

ここでは、5秒をタイムアウトとしています。 タイムアウトしたらselect()は戻り値として0を返しますので 必要な処理をします。

FC Labのホームへ 「ネットワークプログラミング」のページへ