我正在使用我的客户端写入服务器。我想检查套接字是否在我的客户端中打开以便写入,如果在建立连接后它没有准备好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
}
}
}
答案 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;
}