【发布时间】:2012-04-17 08:00:02
【问题描述】:
我需要在 Linux 上使用 epoll 的 tcp 客户端进行异步连接和断开连接。有分机。 Windows 中的函数,例如 ConnectEx、DisconnectEx、AcceptEx 等... 在 tcp 服务器标准接受功能正在工作,但在 tcp 客户端不工作连接和断开...所有套接字都是非阻塞的。
我该怎么做?
谢谢!
【问题讨论】:
-
作为链接 DJB 页面上建议的替代方案,我建议尝试使用
dup和close描述符(并使用副本)。未经测试,但据我了解,它应该可以工作。文档指出,不检查close的返回值是一个严重的编程错误,因为它可能会返回先前的错误。这正是您想要的(如果close给出错误,connect失败)。当然,如果您使用epoll,那么您肯定会有一个操作系统,getsockopt(SO_ERROR)可以正常工作... -
如果可行,最简单的选择是等到 connect() 返回之后再设置 NON_BLOCK。
-
@goldilocks:+1 不是异步的,除非您为此使用工作线程,但我同意简单性很诱人。另外,DNS 解析(您可能需要)无论如何都需要一个工作线程,除非您想阻止它(
getattrinfo_a在内部也这样做)。因此,当您无论如何阻止工作人员时,您也可以阻止连接...... -
我有 1 个工作线程来满足我的所有需求(tcp 服务器/客户端、udp 套接字、timerfd)。在这个线程中,我使用 epoll 进行异步工作。所以我等待 epoll_wait(...) 然后做我需要的。例如:如果套接字正在侦听套接字 - 我调用接受函数,使用此套接字创建新客户端并将其添加到 epoll 队列。但是在 tcpclient 中 - 我无法在连接完成之前将其添加到 epoll ......如果我这样做 - 客户端连接多次(3-4)......
标签: linux sockets asynchronous tcp epoll