2

当我尝试使用非阻塞套接字连接到服务器时(以便我可以使用带有超时参数的 select()),我意识到在连接到被 iptables 使用 -j REJECT 阻塞的端口时,select() 等待直到超时参数,但最多为 3s .. ICMP 端口不可达数据包真的很快也没关系。

fcntl(sockfd, F_SETFL, O_NONBLOCK);
connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr));
if (select(sockfd + 1, NULL, &fdset, NULL, NULL) == 1) {...}

在上面的示例中,如果连接到 localhost:1234 并且端口被阻塞,则 select() 阻塞直到 3 秒,如上所述。

有谁知道为什么这个 3 秒的超时会导致“连接被拒绝”?我该如何调整它(因为我的 ICMP 端口在 0.02 毫秒后无法访问)?

4

1 回答 1

1

connect如果成功,套接字只会变为“可写” 。如果您还想select在失败时返回,您还应该检查套接字上的“错误/异常”条件,即将集合作为第三个fd_set *参数传递给select

于 2011-04-27T16:09:35.087 回答