gpt4 book ai didi

c - UDP 套接字使用 select()

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:31 27 4
gpt4 key购买 nike

您好,我正在创建一个代理服务器,它等待来自具有 UDP 连接的客户端的数据包,并检查它们是否全部有效到达或是否有相同的已被拒绝。

在那种情况下,我应该为每个丢失的数据包(使用 send_ack() )向客户端发送一个“ack”,但是在发送第一个 ack 之后,选择循环的“if 部分”发送无限的 ack,永远不会返回“其他部分”是来自客户端的选择监听数据(接收 _pkt() 函数)

fd_set rset, allset;
int maxfd, nready;
struct timeval timeout;

timeout.tv_sec = 4;
timeout.tv_usec = 150000;
maxfd = socketfd;
FD_ZERO(&allset);
FD_SET(socketfd, &allset);
rset = allset;

for( i=0; ;i++){
do {
nready=select( (maxfd +1), &rset, NULL, NULL, &timeout);
} while ((nready<0) & (errno==EINTR));

if( nready<0) {
perror("Error main: select failed: ");
exit(32);
}
if( nready==0){
send_ack(socketfd,head);
}
else{
receive_pkt(socketfd, head);
}
}

希望已经足够清楚了,感谢您的建议!

最佳答案

在某些系统(尤其是 Linux)上,select 调用会修改超时以显示剩余时间。所以在你的情况下,如果它等待一个数据包 3 秒,超时将减少到 1.15 秒,并且在总共 4.15 秒后,超时将为 0,因此稍后调用 select 将立即返回nready == 0.

如果发送ack后想再次等待,需要将timeout重新设置为非0。

关于c - UDP 套接字使用 select(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15480599/

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