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を返しますので 必要な処理をします。
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を返しますので 必要な処理をします。