Linux,套接字,非阻塞连接
我想创建一个非阻塞连接。像这样:
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
。如果首先启动客户端,则应该
ECONNREFUSED
在最后一步看到错误。如果发生这种情况,请关闭插座并从头开始。如果不查看更多详细信息,很难分辨代码出了什么问题。我想,您不会因
check_socket
操作错误而中止。 - 用创建套接字