Linux,套接字,非阻塞连接

发布于 2021-02-01 16:37:29

我想创建一个非阻塞连接。像这样:

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

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

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

关注者
0
被浏览
111
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

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

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

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

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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看