初めまして。 現在UNIXでのSocket通信プログラムを書いているのですが selectシステムコールとFD_ISSETマクロとの 関係がよくわからずにコードを書いていたところ バグに悩まされています。 select()を使いタイマで割り込み動作を監視しながら recv()で受信を行うというプログラムを書いています FD_ZERO( &fdset ); FD_SET( m_Sockfd, &fdset ); while(recv_size != 0) { work_fdset = fdset; ret = select( 64, &work_fdset, NULL, NULL, &time_out ); if( ret == -1) { 異常処理 } =============================== 割り込み監視 =============================== if( FD_ISSET( m_Sockfd, &work_fdset )) { data_size = recv( m_Sockfd, (void*)(m_pData + m_DataSize)) } m_DataSize += data_size; recv_size -= data_size; } ソースはだいたいこのような感じなのですが、 割り込み監視部分等でコネクションの切断 コネクションの再接続等を行っていると select()の返り値は0でタイムアウトなのですが FD_ISSET()マクロの方は返り値が真になってしまい recv()の発行を行うけれども実際はデータはきておらず recv()で処理がとまってしまい、割り込みの監視ができなくなって しまうというようなバグが発生しています。 ならばselectとFD_ISSETの返り値が真である場合にのみ recv()を発行すればよいと思うのですが なぜこういうケースがでるのかわからなければ 信用し得る修正にならないので書きこみさせてもらいました。 過去ログなどを検索して調べてみましたが 自分なりのなっとくいく回答がえられませんでした。 よければこういうケースになる条件、回避方法等 お教えいただければと思います。 |