gpt4 book ai didi

c - 使用 Select 读取时超时

转载 作者:行者123 更新时间:2023-11-30 15:44:31 24 4
gpt4 key购买 nike

这是我的情况,我使用 UDP,并且有一个服务器正在向我发送数据,但由于数据包丢失,他也可能不会发送数据,我希望他重新发送数据,但是我的客户也可能收不到数据,所以我希望他重新阅读。现在,我决定对我的客户设置超时,他将等待一定的时间,然后重新阅读。我的问题是,简单地添加一个返回到 select 的 goto 就可以解决问题,还是 select 在第一次超时后会被破坏?我必须使套接字成为非阻塞吗?我在网上的某个地方读到过。本质上,我的目标是,如果读取没有发生,在一段时间后重试,因为我知道发件人正在尝试发送。我想知道我的逻辑是否正确,因为我无法测试它。

  fd_set set;
struct timeval timeout;
int rv;
char buff[100];
int len = 100;

FD_ZERO(&set); /* clear the set */
FD_SET(sockfd, &set); /* add our file descriptor to the set */

timeout.tv_sec = 0;
timeout.tv_usec = 10000;

retry:
write(sockfd,"hi",3);//sent to client now waiting for an ack
rv = select(sockfd + 1, &set, NULL, NULL, &timeout);
read(sockfd, buff, strlen(buff), 0);
if(rv == -1)
perror("select"); /* an error accured */
else if(rv == 0)
printf("timeout");
goto retry;
else
read( filedesc, buff, len ); /* there was data to read */
}

最佳答案

我希望 select 会修改您的 fd_set ,以便它在读取后不再包含您的 sockfd (因为它还没有准备好读取)。因此,请确保您应该在重试之前重新初始化该集合。或者您可以尝试超时后 fd 是否仍然存在,但我认为正常行为是在调用 select 之前重新初始化所有 FD。如果您使用 poll 或 epoll,则不必这样做。

除此之外,代码看起来还不错。

无论您使用阻塞还是非阻塞 IO 对于您的情况下的读取并不重要。如果您使用非阻塞,您的写入可能会失败,因此保持阻塞会更容易。

关于c - 使用 Select 读取时超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19455646/

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