2017-04-21 28 views
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 
     } 
    } 

} 

回答

0

你正在做这个事情。您只需执行发送,并且只有在发送EAGAIN/EWOULDBLOCK时才选择可写。套接字几乎总是准备好写入,除非套接字发送缓冲区已满。你的方式是将系统调用加倍并增加延迟。

+0

我有点困惑。如果我做了发送,那么我需要检查errno = EAGAIN || errno = EWOULDBLOCK。如果errno是这些值之一,我是否尝试重新发送?是通过调用select()然后读取它的返回值来实现这一点的一种方法:如果它准备好写入,那么我可以执行continue(),然后返回到循环中的发送? – jonnyd42

+0

我已经回答了。如果'errno'是EAGAIN/EWOULDBLOCK,则选择。 – EJP

+0

即使我的套接字被阻塞,你所说的工作是否仍然有效? – jonnyd42

相关问题