不接受连接会发生什么?

时间:2009-01-22 00:00:57

标签: sockets networking network-programming

假设localhost:80上的侦听套接字和使用以下命令连接的客户端:telnet localhost 80

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

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

我看到的唯一方法是继续接受客户端但断开连接。 我对吗?

3 个答案:

答案 0 :(得分:4)

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

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

如果您只想处理一个连接,那很好,您可以这样做:

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

如果你想要处理多个,那会有点困难。您不能只将backlog参数设置为并发连接数,因为该参数未考虑已激活的连接数。

答案 1 :(得分:1)

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

另外两个选择:

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

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

答案 2 :(得分:0)

当您不想再接受更多连接时,您应该只关闭侦听套接字,并在希望接受连接时再次打开它。监听backlog根本不会帮助你,因为它只是TCP / IP堆栈已接受的“半开”连接,但应用程序尚未接受。