我想在客户端使用 select 函数实现非阻塞套接字。但它没有按预期工作。在下面的代码中,它永远不会遇到 else , rv 始终为 1 并且当套接字上没有任何内容时,应用程序会停止一段时间并在套接字上有另一条消息时继续。我不想要这种行为,我希望客户端在套接字上没有任何要接收的内容时将消息发送回服务器。
fd_set readfds;
fcntl(sd, F_SETFL, O_NONBLOCK);
while (1) {
FD_ZERO(&readfds);
FD_SET(sd, &readfds);
rv = select(sd + 1, &readfds, NULL, NULL, NULL);
if(rv == 1){
nbytes = recvfrom(sd, buf, RW_SIZE, 0, (struct sockaddr *) &srv_addr, &addrlen);
} else {
printf("I'm never here so I can't send message back to the server!\n");
}
}
Run Code Online (Sandbox Code Playgroud)
使用结构 timeval:
fd_set readfds;
fcntl(sd, F_SETFL, O_NONBLOCK);
struct timeval tv;
while (1) {
FD_ZERO(&readfds);
FD_SET(sd, &readfds);
tv.tv_sec = 0;
tv.tv_usec …Run Code Online (Sandbox Code Playgroud) 我编写了一个带有多播套接字的简单 udp 服务器客户端应用程序。服务器每 6 毫秒向三个客户端发送数据包。数据包大小为 1200 字节。这是每秒 166,66 个数据包。每当客户端检测到丢失的数据包时,它就会通过单播向服务器发送 NACK 数据包。
第一次测试: 服务器和三个客户端通过以太网连接到路由器 TP-Link TL-WDR4300 (dd-wrt),一切正常。
第二次测试: 只有服务器通过以太网连接到路由器,其他客户端通过无线2.4GHz和固定信道连接。无线存在两个问题:第一个问题是数据包丢失,客户端仅收到 50% 的数据包。并且丢失会突然出现,例如收到 400 个数据包,丢失 200 个数据包等。第二个问题是,当客户端将 NACK 数据包发送回服务器时,我可以在 Wireshark 上看到该数据包,但我的应用程序无法接收它们。这很奇怪,因为代码与客户端通过以太网连接时的代码相同。那么,有什么想法吗?我会很感激
服务器代码:
while (1) {
FD_ZERO(&readfds);
FD_SET(sd, &readfds);
tv.tv_sec = 0;
tv.tv_usec = 0;
rv = select(sd + 1, &readfds, NULL, NULL, &tv);
while (rv == 1) {
nack_processing(sd);
rv = select(sd + 1, &readfds, NULL, NULL, &tv);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我还进行了更新以减少流量:数据包大小:800 字节数据包之间的到达时间间隔:10 毫秒 = 每秒 100 …