c - 尝试连接到已处理请求的套接字的传入连接会发生什么情况?

标签 c sockets server

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

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

如果需要上下文,请假定 linux 上的 BSD 套接字。

最佳答案

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

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

如果您除了在旧套接字完成时接受新套接字之外什么都不做,那么如果它们是微不足道的,那么许多客户端将耐心等待,如果它们是现有协议(protocol)的不那么微不足道的实现,则可能会放弃他们的连接。

关于c - 尝试连接到已处理请求的套接字的传入连接会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57939035/

相关文章:

c - GCC 中的简单错误陷阱

c - 如何检测 TCP 套接字断开连接(使用 C Berkeley 套接字)

node.js - socket.io 的可扩展架构

Scala - 使用 Akka 的 TCP 数据包帧

java - Java 线程池中的并发

c - 如何禁用 relro 覆盖 fini_array 或 got.plt 元素

C 链表队列 : What should I return when trying to dequeue an empty queue?

c - 为什么我必须点击 "Enter"两次?

c++ - Sendto 函数返回错误 - Windows 上的 UDP 套接字

java - Tomcat 服务器达到 2000 个连接的 websocket 限制