我想创建一个非阻塞连接。像这样:
socket.connect(); // returns immediately
为此,我使用了另一个线程,无限循环和Linux epoll。像这样(伪代码):
// in another thread { create_non_block_socket(); connect(); epoll_create(); epoll_ctl(); // subscribe socket to all events while (true) { epoll_wait(); // wait a small time(~100 ms) check_socket(); // check on EPOLLOUT event } }
如果我先运行服务器,然后运行客户端,那么一切正常。如果我先运行客户端,请稍等一会儿,再运行服务器,然后客户端将无法连接。
我究竟做错了什么?也许可以做不同的事情?
您应该使用以下步骤进行异步连接:
socket(..., SOCK_NONBLOCK, ...)
connect(fd, ...)
0
EINPROGRESS
fd
getsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
没有循环-除非您要处理EINTR。
EINTR
如果首先启动客户端,则应该ECONNREFUSED在最后一步看到错误。如果发生这种情况,请关闭插座并从头开始。
ECONNREFUSED
如果不查看更多详细信息,很难分辨代码出了什么问题。我想,您不会因check_socket操作错误而中止。
check_socket