fd_set rset;
struct timeval tv;
FD_ZERO(&rset);
FD_SET(sockfd, &rset);
tv.tv_sec = 1;
tv.tv_usec = 0;
for(;;)
{
for(count = 0; count < elements in sockaddr_in array; count++)
{
//flag_array is filled with -1 before for(;;)
if(flag_array[count] == -1 && select(sockfd+1, &rset, NULL, NULL, &tv))
{
recvfrom(...)
}
tv.tv_sec = 1;
FD_ZERO(&rset);//this fixed it
FD_SET(sockfd, &rset);//and this too
}
//contact everyone from sockaddr array (works like a charm!)
}
「タイムアウト」が発生する前に他のプログラムからこのプログラムにメッセージを送信しないと、select ステートメントが「失敗」するため、その中で recvfrom ステートメントを使用できません。私はかつて、他のプログラムが無限ループでこれに連絡するようにしましたが、if ステートメントの中に入ることはありませんでした。
何が機能するか: 各タイムアウトが発生する前にこのプログラムに連絡すれば、すべて問題ありません。recvfrom ステートメントを if(___ && select) の外に置くと、完全に正常に動作します。
以下は、このプログラムが Recv と呼ばれる小さな図です。
if(A contacts Recv before timeout) count = 0
Recv stores contact A in struct
if(B contacts Recv before timeout) count = 1
Recv stores contact B in struct
if(timeout) count = 2
if(C contacts Recv after timeout) count = 3
nothing
count = 4
プログラムは A と B に正常に接続します //ループの開始に戻ります
flag_array == -1 is false count = 0
flag_array == -1 is false count = 1
flag_array == -1 is true...select "fails" count = 2..3..4..(exit loop)
これを投稿する 2 分前に、以前のコードを最後にもう一度確認することにしました。忘れたらしい
FD_ZERO(&rset);
FD_SET(sockfd, &rset);
for ループ (tv.tv_sec = 1) の後。
なぜこれを行う必要があるのか 誰かが詳しく説明できますか?