【问题标题】:Can you determine the source IP and port from a connected TCP socket?你能从连接的 TCP 套接字中确定源 IP 和端口吗?
【发布时间】:2011-06-09 16:38:52
【问题描述】:

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

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

【问题讨论】:

标签: c sockets msvcrt libc


【解决方案1】:

应该在 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));

【讨论】:

  • 他在哪里说过他想要一个 ipv6 解决方案?
  • 他在哪里说他没有?这只是需要注意的一点 - 我对这个答案投了 up 票(不合格的“IP”对我来说是 IPv4 或 IPv6)。
【解决方案2】:

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

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

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

在后一种情况下,您只需询问 TCP/IP 堆栈即可:getpeername() 是您的做法。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      相关资源
      最近更新 更多