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

时间:2011-06-20 23:11:32

标签: c linux sockets ddos

  

相关: C++ Winsock API how to get connecting client IP before accepting the connection?

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

据我所知,您必须首先accept连接,然后直接shutdown,如果您因为IP地址而不想与给定客户端通信。

伪代码(我正在寻找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));
     }
 }

2 个答案:

答案 0 :(得分:3)

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

从技术上讲,你有可能以某种方式窥视那些状态信息,但是,它不会做你期望它做的事情。接受套接字是内核(已完成工作)与想要读取数据的程序之间的接口。最简单的方法是接受套接字,如果你不想要它就启动它。

如果要防止首先发生TCP协商,则需要使用iptables。

答案 1 :(得分:1)

没有这样的API可用于TCP w / BSD套接字。建议:使用tcp-wrappers或iptables来做繁重的工作。一个比另一个更自动。

UDP允许你使用MSG_PEEK,这可能会让你看到它来自recvfrom,但是你仍然必须要读取数据包,所以这不是胜利。