8

情况:服务器调用accept()。客户端向服务器发送一个 SYN。服务器获取 SYN,然后将 SYN/ACK 发送回客户端。但是,客户端现在挂起/死亡,因此它永远不会向服务器发送回 ACK。

发生什么了?accept() 是在收到 SYN 后立即返回,还是在返回客户端的 ACK 之前阻塞?如果它阻塞,它最终会超时吗?

4

4 回答 4

9

调用accept()阻塞,直到它有一个连接。除非并且直到 3 次握手完成,否则没有连接,所以accept()不应该返回。对于非阻塞套接字,它不会阻塞,但也不会为您提供有关部分完成握手的信息。

于 2009-04-02T00:47:42.910 回答
2

如果客户端从不发送 ACK,如果套接字标记为非阻塞,accept() 将阻塞或返回 EAGAIN。

于 2009-04-01T18:54:43.960 回答
1

它最终会超时,因为该场景实际上面临 DoS(拒绝服务)和接受返回的资源以供操作系统使用。if 可能会导致主套接字阻塞,因为一旦接受返回一个有效的文件描述符,客户端就会连接到服务器

如果在来自客户端的连接期间发生错误,将设置值 errno 并且一个好主意是记录或显示错误消息。,但是阅读手册页,在大多数情况下它是最好的信息来源。

于 2009-04-01T18:54:31.963 回答
0

如果发生失败,例如由于握手未完成而导致超时,它将返回 -1 并设置 errno。我相信,在查看手册页之后,它会将 errno 设置为 ECONNABORTED。

于 2009-04-02T00:59:11.760 回答