尝试连接到已经处理请求的套接字的传入连接会发生啥?

Posted

技术标签:

【中文标题】尝试连接到已经处理请求的套接字的传入连接会发生啥?【英文标题】:What happens to an incoming connection trying to connect to a socket already processing a request?尝试连接到已经处理请求的套接字的传入连接会发生什么? 【发布时间】:2020-01-16 05:44:46 【问题描述】:

我可以在我的套接字上侦听()时接受()传入连接,但是一旦我接受()连接并正在处理请求,尝试连接到我的端口上的传入连接请求会发生什么忙的socket是绑定的吗?

这是由操作系统超时处理,还是尝试的连接被简单地断开了?

如果需要上下文,假设在 linux 上使用 BSD 套接字。

【问题讨论】:

【参考方案1】:

accept() 阻止传入呼叫,直到它的套接字空闲。

【讨论】:

【参考方案2】:

来自accept(2) manpage:

   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() 来响应它们。 (除了错误之外,没有其他连接想要绑定到新接受的套接字的状态,因为与 LISTENING 套接字不同,它绑定到从队列中接受的客户端的特定源地址和端口。 )

因此,您应该将您的应用程序设计为在合理的时间内重新调用原始 LISTEN 套接字上的接受。有些人使用线程,有些人使用另一个进程来处理每个新套接字,有些人在他们的协议中的任何一个套接字上或在主循环中的任何迭代中阻止大型任务,该循环在每个间隔检查每个正在进行的任务并执行设定工作量。

如果您只接受新的套接字,因为旧的套接字已经完成,那么如果它们是微不足道的,那么许多客户端会耐心地等待,如果它们不是现有协议的不那么微不足道的实现,则可能会放弃它们的连接。

【讨论】:

以上是关于尝试连接到已经处理请求的套接字的传入连接会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

当套接字连续接收到超出程序处理能力的数据时会发生啥?

套接字侦听和连接

是啥导致了这个 Heroku mysql 连接错误? (尝试将前端连接到后端 POST 请求)

描述:无法连接到请求的服务器主机。是啥原因?应该怎么处理才能连上

连接到服务器时客户端套接字超时

缩小 Azure Web 应用程序时打开套接字会发生啥情况?