嗨,当您运行TCP服务器(使用Berkeley Socket API用C语言编写)时,是否可以在实际接受连接之前读取客户端的IP地址/端口?
据我所知,如果您由于其IP地址不想与给定的客户端通信,则必须先 accept
连接,然后直接直接 shutdown
连接。
伪代码(我正在寻找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));
}
}
最佳答案
我认为您的尝试是阻止与特定IP匹配的TCP协商的发生。据我所知,这在套接字层是不可能的。 TCP协商将发生,并且到您接受套接字时,该协商已经发生。
从技术上讲,您可能会以某种方式窥视该状态信息,但是,它并没有按照您的预期去做。接受套接字的是已经完成工作的内核和想要读取数据的程序之间的接口(interface)。最简单的方法是接受套接字,然后在不需要时引导它。
如果要首先避免发生TCP协商,则需要使用iptables。