当前位置: 首页 > 面试题库 >

Linux,套接字,非阻塞连接

公孙智
2023-03-14
问题内容

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

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, ...)
  • 如果返回值既不是也不0EINPROGRESS,则中止并返回错误
  • 等待直到fd发出准备输出的信号
  • 检查插座的状态 getsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
  • 做完了

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

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

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



 类似资料:
  • 问题内容: 为什么有人会喜欢阻止写而不是非阻止写?我的理解是,仅当您想确保写方法返回后,另一端获得了TCP数据包时,才希望阻止写操作,但是我什至不知道这是可能的。您将必须刷新,而刷新则必须刷新 底层操作系统的写套接字缓冲区 。那么,无阻塞套接字写是否有任何缺点?就性能而言,拥有较大的底层写套接字是否会缓冲一个不好的主意?我的理解是,底层套接字写缓冲区越小,当底层套接字缓冲区已满且isWritabl

  • 问题内容: 我有这段代码可以在Linux中从Serial读取,但是我不知道在读取SerialPort时阻塞和非阻塞之间有什么区别,在哪种情况下哪个更好? 问题答案: 您提到的代码是IMO编码和注释不当的代码。该代码不符合POSIX的可移植性惯例,如正确设置终端模式和POSIX操作系统的串行编程指南中所述。该代码没有提到它使用非规范(也称为原始)模式,并且重用了“阻塞”和“非阻塞”术语来描述 VMI

  • 另外,除了调用recv函数后检查WSAGetLastError的值之外,是否还有其他方法可以使用TCP套接字库检测网络断开? 多谢!

  • 问题内容: OpenSSL库允许使用SSL_read从基础套接字读取并使用SSL_write对其进行写入。这些函数可能会根据其SSL协议需求(例如,在重新协商连接时),以SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE返回。 我不太了解API希望我如何处理这些结果。 对一个接受客户端连接的服务器应用程序进行映像,建立一个新的ssl会话,使基础套接字成为非阻塞状态,然

  • 我有一个小问题与Android和IOS之间实现套接字连接。当我使用我的应用程序连接两个Android运行设备时,一切正常。但是当我必须从Iphone应用程序接收一些数据时,我的readStream函数被阻塞,我可以在另一个部分关闭套接字后接收所有数据,这样我就不能返回任何响应。以下是我用来听的: 这里是我用来将转换为的函数: Iphone/Android应用程序的工作原理如下: 首先,它创建Soc

  • 下面是我用来将套接字设置为非阻塞的代码: 你知道我做错了什么吗?(它在我的Windows构建中运行良好,使用: