一尘不染

Linux,套接字,非阻塞连接

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
  }
}

如果我先运行服务器,然后运行客户端,那么一切正常。如果我先运行客户端,请稍等一会儿,再运行服务器,然后客户端将无法连接。

我究竟做错了什么?也许可以做不同的事情?


阅读 201

收藏
2020-06-07

共1个答案

一尘不染

您应该使用以下步骤进行异步连接:

  • 用创建套接字 socket(..., SOCK_NONBLOCK, ...)
  • 开始与 connect(fd, ...)
  • 如果返回值既不是也不0EINPROGRESS,则中止并返回错误
  • 等待直到fd发出准备输出的信号
  • 检查插座的状态 getsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
  • 做完了

没有循环-除非您要处理EINTR

如果首先启动客户端,则应该ECONNREFUSED在最后一步看到错误。如果发生这种情况,请关闭插座并从头开始。

如果不查看更多详细信息,很难分辨代码出了什么问题。我想,您不会因check_socket操作错误而中止。

2020-06-07