【发布时间】:2010-10-16 22:50:40
【问题描述】:
情况:服务器调用accept()。客户端向服务器发送一个 SYN。服务器获取 SYN,然后将 SYN/ACK 发送回客户端。但是,客户端现在挂起/死了,因此它永远不会向服务器发送回 ACK。
会发生什么? accept() 是在收到 SYN 后立即返回,还是在返回客户端的 ACK 之前阻塞?如果它阻塞,它最终会超时吗?
【问题讨论】:
标签: networking sockets posix tcp
情况:服务器调用accept()。客户端向服务器发送一个 SYN。服务器获取 SYN,然后将 SYN/ACK 发送回客户端。但是,客户端现在挂起/死了,因此它永远不会向服务器发送回 ACK。
会发生什么? accept() 是在收到 SYN 后立即返回,还是在返回客户端的 ACK 之前阻塞?如果它阻塞,它最终会超时吗?
【问题讨论】:
标签: networking sockets posix tcp
对accept() 的调用会阻塞,直到建立连接。除非并且直到 3 次握手完成,没有连接,所以 accept() 不应该返回。对于非阻塞套接字,它不会阻塞,但也不会为您提供有关部分完成握手的信息。
【讨论】:
如果客户端从不发送 ACK,如果套接字标记为非阻塞,accept() 将阻塞或返回 EAGAIN。
【讨论】:
它最终会超时,因为该场景实际上面临 DoS(拒绝服务)和接受的资源返回给操作系统使用。 if 可能会导致主套接字阻塞,因为一旦接受返回一个有效的文件描述符,客户端就会连接到服务器
如果在来自客户端的连接过程中发生错误,将设置 errno 值,并且一个好主意是记录或显示错误消息。 ,但是阅读手册页,在大多数情况下它是最好的信息来源。
【讨论】:
如果发生失败,例如由于握手未完成而导致超时,它将返回 -1 并设置 errno。我相信,在查看手册页之后,它会将 errno 设置为 ECONNABORTED。
【讨论】: