我正在尝试使用C语言编写TCP服务器代码。我刚刚注意到accept()
函数在建立连接后返回。
某些客户端充斥着随机数据,有些客户端只是发送随机数据一次,之后我要关闭它们的当前连接和将来的连接几分钟(或更长时间,取决于负载程序有多少)。< / p>
我可以将不良客户端IP地址保存在阵列中,也可以节省时间,但是我找不到任何功能来中止当前连接或拒绝来自不良客户端的连接。
我发现Windows操作系统的一个名为WSAAccept
的功能可让您根据用户的选择拒绝连接,但我不使用Windows操作系统。
我尝试了原始TCP服务器代码,该服务器允许您从头开始访问包括所有TCP标头的TCP数据包,并且它不自动接受连接。我尝试通过程序端处理连接,包括SYN ACK和其他TCP信号。它可以正常工作,但是后来我注意到原始TCP服务器会在网络接口中接收所有数据包,而当其他程序的通信量很大时,它也会使我的程序变慢。
我尝试使用libnetfilter,它允许您过滤网络接口中的全部流量。它也可以工作,但是像原始TCP服务器一样,它也接收整个网络接口的数据包,这在流量很大时会变慢。我也尝试比较libnetfilter和iptables。 libnetfilter比iptables慢。
总而言之,我如何在不损害其他客户端连接的情况下中止客户端的当前和将来连接?
我的Linux使用的是debian 10。
答案 0 :(得分:1)
一旦在数据包级别上将其列入黑名单,您很快就会很容易受到基于IP欺骗的微不足道的攻击。对于一个非常基本的实现,攻击者可以通过向您发送许多具有伪造源IP地址的数据包,从而使用您的数据包级黑名单将他想要的任何人列入黑名单。通常,您不想触碰这些过滤(除非您真的知道自己在做什么),而只是信任防火墙等。
因此,我实际上建议仅从theCell.Value = theCell.Text
获取文件描述符后立即close
。