在 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)
中得到-1
和EINPROGRESS
。然后将套接字文件描述符添加到轮询集,并使用select(2)
或poll(2)
等待它。
通过这种方式,您可以同时进行多次连接尝试(例如浏览器就是这样做的)并且能够有更严格的超时。
【讨论】:
【参考方案2】:connect 可能会立即返回 EINPROGRESS 错误。阅读select的使用。
请注意,您可能希望将调用包含在 TEMP_FAILURE_RETRY 宏中。
【讨论】:
嗯,这里有什么意义?它与 blockingconnect
有何不同?
@NikolaiNFetissov 公平点,我已经编辑了我的答案以删除可能具有误导性的代码 sn-p 并强调使用 TEMP_FAILURE_RETRY以上是关于在 C 中使用非阻塞套接字连接的主要内容,如果未能解决你的问题,请参考以下文章