Related: C++ Winsock API how to get connecting client IP before accepting the connection?
您好,当您运行一个 TCP 服务器(用 C 语言编写,使用伯克利套接字 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));
}
}
最佳答案
我认为您尝试做的是在匹配特定 IP 时阻止 TCP 协商发生。据我所知,这在套接字层是不可能的。 TCP 协商将发生,当您接受套接字时,协商已经发生。
从技术上讲,您可以通过某种方式查看该状态信息,但是,它不会按照您的预期进行。接受套接字是已经完成工作的内核与想要读取数据的程序之间的接口(interface)。最简单的做法是接受套接字,如果不需要,则启动它。
如果你想首先阻止 TCP 协商的发生,你需要使用 iptables。
关于c - Linux TCP 服务器 : reading client's IP address before accepting connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6418603/