gpt4 book ai didi

c - select 和 recvfrom 的意外结果

转载 作者:太空宇宙 更新时间:2023-11-04 00:41:41 25 4
gpt4 key购买 nike

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)位于。

有人可以详细说明为什么有必要这样做吗?

最佳答案

select() 修改传递的fd_set - 您必须在每次调用 select() 之前进行设置.这就是select()应该可以。

关于c - select 和 recvfrom 的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5697263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com