Linux TCP服务器:在接受连接之前读取客户端的IP地址

kay*_*kay 5 c sockets linux ddos

相关: C++ Winsock API如何在接受连接之前获取连接客户端IP?

嗨,当您运行TCP服务器(用C语言编写,使用Berkeley套接字API)时,是否可以在实际接受连接之前读取客户端的IP地址/端口?

据我所知,如果您不想因为其IP地址而与给定客户端通信,则必须首先accept进行连接shutdown.

伪代码(我正在寻找peekrefuse方法):

 int serverfd = listen(...);
 for(;;) {
     struct sockaddr_in clientAddr;
     peek(serverfd, &clientAddr, sizeof(clientAddr));
     if(isLegit(&clientAddr)) {
         int clientfd = accept(serverfd, &clientAddr, sizeof(clientAddr));
         handleClient(clientfd);
     } else {
         refuse(serverfd, &clientAddr, sizeof(clientAddr));
     }
 }
Run Code Online (Sandbox Code Playgroud)

Cla*_*ris 5

我认为你想要做的就是阻止 TCP 协商在与特定 IP 匹配时发生。据我所知,这在套接字层是不可能的。TCP 协商将会发生,当您接受套接字时,协商已经发生。

从技术上讲,您可能可以以某种方式查看该状态信息,但是,它不会执行您期望的操作。接受套接字是内核(已经完成工作)和想要读取数据的程序之间的接口。最简单的方法是接受套接字,如果不需要,则启动它。

如果你想从一开始就阻止 TCP 协商的发生,你需要使用 iptables。