我想让我的服务器从连接的 TCP 套接字确定客户端的源 IP 和端口。由于我的客户端可能在 NAT 之后,我不能依赖客户端告诉我(在连接协议中)......如果可能的话,我将需要在 Windows 和 Linux 上实现它。 ..但是任何一个的答案都会帮助我开始......
我正在使用 C,我正在寻找基于 libc 或 msvcrt 的解决方案。
如果对等方位于 NAT 之后,您可以谈论两个不同的 IP(从您的问题中不清楚您想要哪一个):
在前一种情况下,TCP/IP 堆栈没有可用的解决方案:此信息在您的主机上不存在,因为 NAT 将所有内部 IP 替换为每个数据包自己的 IP。因此,唯一的解决方案是让您在协议中支持此功能。
在后一种情况下,您只需询问 TCP/IP 堆栈:getpeername()就是您的操作方式。
应该在linux和windows中都可以工作:
struct sockaddr_in addr;
socklen_t len;
len = sizeof addr;
getpeername(clientSocket, (struct sockaddr*)&addr, &len);
printf("Remote IP address: %s\n", inet_ntoa(addr.sin_addr));
如果您的客户端位于 NAT 之后,则无法检测到远程 IP。如果您尝试这样做,您将始终获得 NAT ip。我知道的唯一方法是将客户端 IP 与请求一起发送到您的服务器(作为请求的一部分)。
但是你不清楚你想要什么。您没有告诉我们您使用的是什么语言,也没有告诉我们您在谈论哪种服务器。这将阻止我们为您提供有用的答案。