6

我正在将脚本中的套接字连接更改为非阻塞连接。在一个教程中,我发现了以下几行:

x=fcntl(s,F_GETFL,0);              // Get socket flags
fcntl(s,F_SETFL,x | O_NONBLOCK);   // Add non-blocking flag

所以我在创建套接字之后和连接语句之前添加了它们。它不再阻塞:),但它也没有连接。我没有收到任何错误,连接只是返回-1。如果我将这些行注释掉,它就会连接起来。

我还需要添加什么才能获得非阻塞连接?

4

2 回答 2

6

检查返回值connect(2)- 你应该得到-1, 和EINPROGRESSin errno(3)。然后将套接字文件描述符添加到轮询集,并使用select(2)or等​​待它poll(2)

这样,您可以同时进行多个连接尝试(例如浏览器就是这样做的)并且能够有更严格的超时。

于 2012-09-27T15:14:40.213 回答
4

connect可能会立即返回 EINPROGRESS 错误。阅读使用select

请注意,您可能希望在TEMP_FAILURE_RETRY宏中包装对 select 的调用。

于 2012-09-27T15:09:37.753 回答