我可以在套接字上侦听((时接受((传入连接,但是一旦我接受了((连接并正在处理请求,传入连接请求尝试在我忙碌的套接字绑定到的端口上进行连接会发生什么?
这是由超时的操作系统处理的,还是只是尝试的连接被丢弃?
如果需要上下文,请在 Linux 上假设 BSD 套接字。
从 accept(2( 手册页:
The accept() system call is used with connection-based socket types (SOCK_STREAM, SOCK_SEQPACKET). It extracts the first connection request on the queue of pending connections for the listening socket, sockfd, creates a new connected socket, and returns a new file descriptor referring to that socket. The newly created socket is not in the listening state. The original socket sockfd is unaffected by this call.
因此,其他连接正在原始套接字上的队列中建立,等待应用程序通过再次调用accept()
来响应它们。(撇开错误不谈,没有其他连接想要绑定到新接受的套接字的状态,因为与 LISTEN 套接字不同,它绑定到从队列中接受的客户端的特定源地址和端口。
因此,您应该将应用程序设计为在合理的时间内返回到在原始 LISTEN 套接字上调用 accept。有些人使用线程,有些人分叉以有另一个进程来处理每个新套接字,有些人阻止大型任务在其协议中的任何一个套接字上或在主循环中的任何迭代中,该循环在每个时间间隔检查每个正在进行的任务并执行一定数量的工作。
如果您什么都不做,而是接受新套接字,因为旧的套接字已经完成,那么许多客户端将耐心等待它们是否微不足道,如果它们是现有协议中不那么微不足道的实现,则可能会放弃它们的连接。
accept(( 阻止传入调用,直到它的套接字空闲。