0
我正在使用我的客户机写入服务器。我想检查套接字是否在我的客户端中写入,如果在建立连接后它尚未准备好10秒,那么我想打印一条错误消息并由于超时而退出我的客户端。在使用send()之前用select()检查套接字
客户端只使用发送功能就能正常工作,并且能够将文件从客户端传输到服务器。然而,当我实现的select()功能,客户现在只是超时与sel_value被设置为0
为了便于阅读,我已删除了我的代码,不会发送功能,因为有一些用于将内容读入缓冲区的附加逻辑。
//set up select for sending
fd_set wfds;
struct timeval timeout;
while (1) {
FD_ZERO(&wfds);
FD_SET(sockfd, &wfds);
timeout.tv_sec = 10;
timeout.tv_usec = 0; //no us
int sel_value = select(sockfd+1, &wfds, NULL, NULL, &timeout);
cout<<"sel_value is: "<<sel_value<<endl;
if(sel_value == -1){
perror("select");
}else if(sel_value == 0){
printf("Timeout. Cannot send for 10s \n");
break;
}
else{
if(FD_ISSET(sockfd, &wfds)){
//my code never reaches this point, but here is where we send
//code to send stuff
}
}
}
我有点困惑。如果我做了发送,那么我需要检查errno = EAGAIN || errno = EWOULDBLOCK。如果errno是这些值之一,我是否尝试重新发送?是通过调用select()然后读取它的返回值来实现这一点的一种方法:如果它准备好写入,那么我可以执行continue(),然后返回到循环中的发送? – jonnyd42
我已经回答了。如果'errno'是EAGAIN/EWOULDBLOCK,则选择。 – EJP
即使我的套接字被阻塞,你所说的工作是否仍然有效? – jonnyd42