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!)
}
Если я не отправлю свое сообщение из другой программы в эту программу до того, как произойдет «тайм-аут», оператор выбора «завершится ошибкой», поэтому я не могу использовать внутри него оператор 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
программа свяжется с А и Б просто отлично
// возвращается к началу цикла
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) в.
Может кто-нибудь уточнить, зачем это нужно делать?