在 C 中使用非阻塞套接字连接

Posted

技术标签:

【中文标题】在 C 中使用非阻塞套接字连接【英文标题】:using a non-blocking socket connection in C 【发布时间】:2012-09-27 15:07:26 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

请注意,您可能希望将调用包含在 TEMP_FAILURE_RETRY 宏中。

【讨论】:

嗯,这里有什么意义?它与 blocking connect 有何不同? @NikolaiNFetissov 公平点,我已经编辑了我的答案以删除可能具有误导性的代码 sn-p 并强调使用 TEMP_FAILURE_RETRY

以上是关于在 C 中使用非阻塞套接字连接的主要内容,如果未能解决你的问题,请参考以下文章

检测非阻塞套接字上的关闭连接

没有 ConnectEx 的 Windows 上的非阻塞套接字连接

在 C 编程中使用 libevent 编写非阻塞事件

非阻塞套接字与IO多路复用

没有 while(true) 循环的 C# 非阻塞套接字

为啥非阻塞套接字在connect() 或accept() 之前是可写的?