在套接字编程中使用非阻塞版本的 connect() 调用时使用的回调机制是什么?

Dar*_*n L 0 sockets networking tcp nonblocking

在套接字编程中,假设服务器正在侦听特定端口上的 TCP 连接。现在,在客户端,我创建一个套接字并调用connect()与服务器建立连接。注意:connect() API 以非阻塞模式调用。

由于它是非阻塞调用,并且在调用connect() API 时没有传递回调方法以在事件完成时收到通知。所以,我想知道客户端如何知道 TCP 连接何时已成功建立。这样它就可以启动数据传输?

问题的第二部分 -何时。基本上,要建立 TCP 连接,应该发生 3 种方式的握手,如下所示 -

在此输入图像描述

我假设,当从客户端调用connect() API 时,客户端会发送SYNC数据包并启动连接建立过程。由于connect() API 是以非阻塞模式调用的,因此它只是通过请求内核来发起连接并返回函数调用。一旦成功建立连接,内核就必须通知客户端:可以开始传输数据了。我的困惑是,最后一个阶段是在服务器端完成3次握手(在服务器端到达ACK数据包之后),那么客户端的内核如何知道连接过程的完成?

或者内核一旦收到服务器进程的SYNC+ACK就会通知客户端进程连接建立

use*_*421 6

没有回调机制。在某些 API 中,回调机制与异步I/O相关。不适用于非阻塞 I/O。不,它们不是同一件事。

当非阻塞connect()没有立即完成时(通常不会),否则有什么意义,它会返回 -1 并errno设置为EINPROGRESS。然后,您应该select()poll()epoll()套接字以实现可写性,如man connect中所述。重申一下,这不是回调机制。它实际上是一种轮询机制。