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

标签 c linux sockets networking tcp

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

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

我可以将错误的客户端 IP 地址保存在一个数组中,也可以保存时间,但我找不到任何用于中止当前连接或拒绝来自错误客户端的 future 连接的函数。

我发现了一个名为 WSAAccept 的 Windows 操作系统功能,它允许您根据用户选择拒绝连接,但我不使用 Windows 操作系统。

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

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

总而言之,我如何才能在不伤害其他客户端连接的情况下中止客户端的当前和 future 连接?

我有带 debian 10 的 linux。

最佳答案

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

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

关于c - 在 accept() 之前拒绝客户端的 TCP 连接请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57872650/

相关文章:

c++ - 在包含 float 的结构上使用 memset()

c - 结构体指针作为参数并返回

linux - 杀死正在运行的 docker 容器后进行清理

c - XFetchName 始终返回 0

java套接字超时行为

c - 未定义对 gets_s 的引用?

c - 我在 xcode 中遇到一些 C 问题

linux - 如何准确衡量性能,排除后台程序干扰?

iOS 客户端,C++ 服务器?

python - 在python中将字节转换为字符串