【发布时间】:2020-01-12 07:42:03
【问题描述】:
我正在尝试用 C 语言编写 TCP 服务器代码。我刚刚注意到accept() 函数在连接建立后返回。
一些客户端充斥着随机数据,一些客户端只是发送一次随机数据,之后我想关闭他们当前的连接和未来的连接几分钟(或更长时间,取决于程序有多少负载)。
我可以将坏客户端 IP 地址保存在数组中,也可以保存时间,但我找不到任何函数来中止当前连接或拒绝来自坏客户端的未来连接。
我找到了一个名为 WSAAccept 的 Windows 操作系统函数,它允许您根据用户的选择拒绝连接,但我不使用 Windows 操作系统。
我尝试了代码原始 TCP 服务器,它允许您从头开始访问 TCP 数据包,包括所有 TCP 标头,并且它不会自动接受连接。我尝试通过程序端处理连接,包括 SYN ACK 和其他 TCP 信号。它有效,但后来我注意到原始 TCP 服务器接收到我的网络接口中的所有数据包,当其他程序使用高流量时,它也会使我的程序滞后。
我尝试使用 libnetfilter,它允许您过滤网络接口中的整个流量。它也可以工作,但就像原始 TCP 服务器一样,它也接收整个网络接口的数据包,当流量很大时,它会变得很慢。我还尝试将 libnetfilter 与 iptables 进行比较。 libnetfilter 比 iptables 慢。
总而言之,我怎样才能在不损害其他客户端连接的情况下中止客户端当前和未来的连接?
我有 linux 和 debian 10。
【问题讨论】:
-
我相信您正在寻找的解决方案是内核的数据包过滤器。另请参阅 Packet Filtering HowTo 和 How can I programmatically manage iptables rules on the fly?(和朋友)。
-
包过滤非常慢,因为它不仅处理我服务器的 TCP 端口,还处理整个接口。此外,带有
system()调用的iptables命令非常脏,而且编码起来也很费劲。 @jww -
查找 libiptc.
-
我会尽快检查 libiptc。 @matteomartelli 的问题有点相同,但该线程没有回答我要查找的内容。
标签: c linux sockets networking tcp