6

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

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

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

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

 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));
     }
 }
4

2 回答 2

4

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

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

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

于 2011-06-20T23:23:54.357 回答
1

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

UDP 允许您使用 MSG_PEEK,这可能让您通过 recvfrom 看到它来自谁,但无论如何您仍然必须读取数据包,所以这不是胜利。

于 2011-06-20T23:18:57.130 回答