【问题标题】:using a non-blocking socket connection in C在 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。如果我将这些行注释掉,它就会连接。

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

【问题讨论】:

    标签: c sockets


    【解决方案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
      猜你喜欢
      • 2013-07-20
      • 2017-04-18
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多