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

2024-05-09

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(使用前将#替换为@)

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

随机推荐