Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 不被接受的连接会发生什么情况?_Sockets_Networking_Network Programming - Fatal编程技术网

Sockets 不被接受的连接会发生什么情况?

Sockets 不被接受的连接会发生什么情况?,sockets,networking,network-programming,Sockets,Networking,Network Programming,假设localhost:80上有一个侦听套接字,而客户端使用telnet localhost:80进行连接 问题是我只想接受有限数量的并发客户端,假设只有一个。 在那之后,我什么都不接受 我在使用:netstat-a时看到的问题是建立了下一个客户端连接。是的,我不处理它,但在系统级别上,它显示为已建立,客户端可以发送数据,可能会给系统带来额外的开销 我看到的唯一方法是继续接受客户,但断开他们的连接。 我说得对吗 如果您停止侦听该端口,则不应再允许任何传入连接。确保侦听器在接受第一个连接后关闭 其

假设localhost:80上有一个侦听套接字,而客户端使用telnet localhost:80进行连接

问题是我只想接受有限数量的并发客户端,假设只有一个。 在那之后,我什么都不接受

我在使用:netstat-a时看到的问题是建立了下一个客户端连接。是的,我不处理它,但在系统级别上,它显示为已建立,客户端可以发送数据,可能会给系统带来额外的开销

我看到的唯一方法是继续接受客户,但断开他们的连接。
我说得对吗

如果您停止侦听该端口,则不应再允许任何传入连接。确保侦听器在接受第一个连接后关闭

其他两种选择:

使用原始套接字(如果操作系统支持)。并手动处理TCP连接。这将涉及大量额外的代码和处理

使用UDP。它们是无状态连接,但是您必须基于其他内容接受/拒绝数据包。但这并没有TCP连接的开销。此外,您将无法使用telnet之类的工具进行测试。

函数的
listen()
函数有一个
backlog
参数,用于指定允许有多少未完成的套接字挂在操作系统内核中,等待服务器接受它们

在我的Linux系统上,
listen()
的手册页上说,大多数情况下,客户端会收到一个
连接被拒绝的错误,就像套接字根本没有监听一样

如果您只想处理一个连接,那么可以执行以下操作:

listen(s, 0);
while ((new_fd = accept(s)) >= 0) {
    process(new_fd);
}

如果你想处理多个问题,那就有点难了。您不能只将
backlog
参数设置为并发连接的数量,因为该参数不考虑已经有多少连接处于活动状态。

当您不再希望接受更多连接时,只需关闭侦听套接字,当您确实希望接受连接时,再打开它即可。listen backlog对您毫无帮助,因为它只是针对TCP/IP堆栈已接受但应用程序尚未接受的“半开放”连接

这样可以,但会影响性能,因为每次并发客户端数量超过阈值时,我们都会启动/停止侦听。