【发布时间】:2014-08-16 12:55:19
【问题描述】:
我想在客户端实现带有选择功能的非阻塞套接字。但它没有按预期工作。在下面的代码中,它永远不会遇到 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");
}
}
使用 struct 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 = 0;
rv = select(sd + 1, &readfds, NULL, NULL, &tv);
if(rv == 1){
nbytes = recvfrom(sd, buf, RW_SIZE, 0, (struct sockaddr *) &srv_addr, &addrlen);
} else {
printf("I'm always here like now ! \n");
}
}
【问题讨论】:
-
您是否在检查
fcntl调用是否成功并且您的系统中是否有O_NONBLOCK 可用? -
是的,我检查了 fcntl 是否返回 -1 而不是,它返回 0