Related: C++ Winsock API如何在接受连接之前获取连接客户端IP? https://stackoverflow.com/questions/716209/c-winsock-api-how-to-get-connecting-client-ip-before-accepting-the-connection
您好,当您运行 TCP 服务器(用 C 语言编写,使用 Berkeley Socket API)时,是否可以在实际接受连接之前读取客户端的 IP 地址/端口?
据我所知你必须accept http://www.kernel.org/doc/man-pages/online/pages/man2/accept.2.html首先连接并且shutdown http://www.kernel.org/doc/man-pages/online/pages/man2/shutdown.2.html如果您因其 IP 地址而不想与给定客户端进行通信,则可直接使用该客户端。
伪代码(我正在寻找peek
and 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));
}
}
我认为你想要做的就是阻止 TCP 协商在与特定 IP 匹配时发生。据我所知,这在套接字层是不可能的。 TCP 协商将会发生,当您接受套接字时,协商已经发生。
从技术上讲,您可能可以以某种方式查看该状态信息,但是,它不会执行您期望的操作。接受套接字是内核(已经完成工作)和想要读取数据的程序之间的接口。最简单的方法是接受套接字,如果不需要,则启动它。
如果你想从一开始就阻止 TCP 协商的发生,你需要使用 iptables。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)