0

我想让我的服务器从连接的 TCP 套接字确定客户端的源 IP 和端口。由于我的客户端可能在 NAT 之后,我不能依赖客户端告诉我(在连接协议中)......如果可能的话,我将需要在 Windows 和 Linux 上实现它。 ..但是任何一个的答案都会帮助我开始......

我正在使用 C,我正在寻找基于 libc 或 msvcrt 的解决方案。

4

3 回答 3

3

如果对等方位于 NAT 之后,您可以谈论两个不同的 IP(从您的问题中不清楚您想要哪一个):

  • 内部网络中对端的IP(例如192.168.1.2);
  • NAT 自身的外部 IP

在前一种情况下,TCP/IP 堆栈没有可用的解决方案:此信息在您的主机上不存在,因为 NAT 将所有内部 IP 替换为每个数据包自己的 IP。因此,唯一的解决方案是让您在协议中支持此功能。

在后一种情况下,您只需询问 TCP/IP 堆栈:getpeername()就是您的操作方式。

于 2011-06-09T18:12:19.970 回答
3

应该在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));
于 2011-06-09T18:20:53.120 回答
0

如果您的客户端位于 NAT 之后,则无法检测到远程 IP。如果您尝试这样做,您将始终获得 NAT ip。我知道的唯一方法是将客户端 IP 与请求一起发送到您的服务器(作为请求的一部分)。

但是你不清楚你想要什么。您没有告诉我们您使用的是什么语言,也没有告诉我们您在谈论哪种服务器。这将阻止我们为您提供有用的答案。

于 2011-06-09T16:48:23.917 回答