相关: C++ Winsock API how to get connecting client IP before accepting the connection?
嗨,当您运行TCP服务器(用C语言编写,使用Berkeley套接字API)时,是否可以在实际接受连接之前读取客户端的IP地址/端口?
据我所知,您必须首先accept
连接,然后直接shutdown
,如果您因为IP地址而不想与给定客户端通信。
伪代码(我正在寻找peek
和refuse
方法):
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));
}
}
答案 0 :(得分:3)
我认为您尝试做的是阻止TCP协商与特定IP匹配时发生。据我所知,这在套接字层是不可能的。将进行TCP协商,当您接受套接字时,协商已经发生。
从技术上讲,你有可能以某种方式窥视那些状态信息,但是,它不会做你期望它做的事情。接受套接字是内核(已完成工作)与想要读取数据的程序之间的接口。最简单的方法是接受套接字,如果你不想要它就启动它。
如果要防止首先发生TCP协商,则需要使用iptables。
答案 1 :(得分:1)
没有这样的API可用于TCP w / BSD套接字。建议:使用tcp-wrappers或iptables来做繁重的工作。一个比另一个更自动。
UDP允许你使用MSG_PEEK,这可能会让你看到它来自recvfrom,但是你仍然必须要读取数据包,所以这不是胜利。