使用send()之前用select()检查套接字

时间:2017-04-21 22:32:17

标签: c++ sockets select

我正在使用我的客户端写入服务器。我想检查套接字是否在我的客户端中打开以便写入,如果在建立连接后它没有准备好10s,那么我想打印一条错误消息并因超时而退出我的客户端。

客户端只使用send函数正常工作,我可以将文件从客户端传输到服务器。但是,当我实现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
        }
    }

}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

用于写入第三个字段,即:

BooleanSupplier r = () -> {
    String reinBranches = (String) application.getAttribute("xx_xx_xx");

    if(reinBranches != null && reinBranches.length() > 0)
    {
        String reinBranchArray[] = reinBranches.split(",");
        for(int i = 0; i < reinBranchArray.length; i++)
        {
            if(reinBranchArray[i].equals((String) session.getAttribute("xyz_xyz_xyz"))) {
                return true;
            }
        }
    }
    return false;
}