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)之后。
有人可以详细说明为什么有必要这样做吗?