• 締切済み

初めまして。HPUX11iv2サーバを使ってTCP通信のプログラム開発

初めまして。HPUX11iv2サーバを使ってTCP通信のプログラム開発を行い始めたものです。 selectの挙動について質問があります。 下記のようにselectの戻りが正常の場合にどのソケットが読み取り可能か調べるプログラムで一番したのelseケースは発生するものでしょうか?(タイムアウト以外で何も読み取り可とならないパターン) 私の書いたプログラムでは発生しています。それが自分のバグでそう動いてしまっているのか、そう動くパターンがあるのか調べて判断がつかなかった為、質問させていただきました。もしわかる方いらっしゃいましたら回答を宜しくお願いいたします。 ret = select ( nfds, &readfds, 0, 0, null ); if ( ret > 0 ) {  if ( FDISSET( procfd, &readfds ) ) // UNIXデータグラムソケット  {   // プロセス間メッセージ受信処理  }  else if ( FDISSET( listenfd, &readfds ) ) // Listen用ソケット  {   // accept処理  }  else if ( FDISSET( tcpfd, &readfds ) ) //TCP送受信用ソケット  {   // TCPメッセージ受信処理  }  else  {  } }

みんなの回答

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

select関数の戻り値は「セットされているディスクリプタの数」ですから、それが0より大きいのなら、仕様上、どれか1つはセットされていることは保証されます。 もしelse節に入るなら、readfds の初期化が正しくできているかどうかを疑うと思います。 それと、もうちょっと根本的な問題ですが、 select の結果としては、二つ以上のディスクリプタが準備できている場合もありえます。 else if で並べるのではなく、3つのifは並列に処理するべきでしょう。 (例えば、今のコードだと、procfd が常時流れ続けているような状況になった場合、selectの結果に必ずprocfdが含まれることになります。 そのため、elseifで繋ぐと、常に最初のifだけを処理するため、listenfd や tcpfd がセットされても、それについての処理が行われることがない、ということになってしまいます。)

maaatkoji
質問者

お礼

遅くなってすみません。 解決いたしました。 このソースとは別の場所ですが、FD_SETするところで前回の情報を上書きしてしまってSETされた情報が残ってしまっていました。残ってしまったものをSELECTしたのでelseケースに陥ってしまっていました。 またSelect後のの処理についてですが、今回はトラフィックが多くないのでそのままとしました。 今後はしっかり意識してコーディングをしていきたいと思います。 回答ありがとうございました。 失礼いたします。

関連するQ&A