c语言 - 在accept()之前拒绝客户端的TCP连接请求



我正在尝试用C语言编写TCP服务器代码。我刚刚注意到accept()函数在已经建立连接时返回。

有些客户端充斥着随机数据,有些客户端只发送一次随机数据,之后我想关闭他们当前的连接和未来的连接几分钟(或更多,取决于有多少负载程序(。

我可以将错误的客户端 IP 地址保存在数组中,也可以保存计时,但我找不到任何中止当前连接或拒绝来自不良客户端的未来连接的功能。

我找到了一个名为WSAAccept的Windows操作系统函数,它允许您通过用户选择拒绝连接,但我不使用Windows操作系统。

我尝试了代码原始TCP服务器,它允许您从头开始访问TCP数据包,包括所有TCP标头,并且它不会自动接受连接。我尝试通过程序端处理连接,包括 SYN ACK 和其他 TCP 信号。它有效,但后来我注意到原始TCP服务器在我的网络接口中接收所有数据包,当其他程序使用高流量时,它也使我的程序滞后。

我尝试使用libnetfilter,它允许您过滤网络接口中的整个流量。它也可以工作,但像原始TCP服务器一样,它也接收整个网络接口的数据包,当流量很大时,这会使其变慢。我也尝试将libnetfilter与iptables进行比较。libnetfilter 比 iptables 慢。

因此,总而言之,如何在不损害其他客户端连接的情况下中止客户端当前和未来的连接?

我有 debian 10 的 linux。

一旦你在数据包级别上列入黑名单,你可能会很快受到基于 IP 欺骗的非常微不足道的攻击。对于非常基本的实现,攻击者可以使用您的数据包级别黑名单将他想要的任何人列入黑名单,只需向您发送许多带有虚假源 IP 地址的数据包即可。通常您不想接触这些过滤(除非您真的知道自己在做什么(,而您只是信任您的防火墙等。

所以我建议真的只是在从accept获取文件描述符后立即close文件描述符。

最新更新