这是我的情况,我正在使用 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 */
}