如何检查TCP连接是否是本地的?

时间:2014-08-23 14:29:08

标签: c++ sockets tcp

对于项目,我需要知道网络连接是来自本地计算机还是来自远程计算机。

如何实现这一目标?

1 个答案:

答案 0 :(得分:5)

这可以通过使用getpeernamegetsockname函数来实现。

这个剪辑完全符合我的要求:

 bool checkForLocalConnection(SOCKET Sock) {
      sockaddr_in RemAddr, LocAddr;
      int Len = sizeof(RemAddr);
      getpeername(Sock, (sockaddr *)&RemAddr, &Len);
      getsockname(Sock, (sockaddr *)&LocAddr, &Len);
      return (RemAddr.sin_addr.S_un.S_addr == LocAddr.sin_addr.S_un.S_addr);
 }

结果的结尾始终是相同的,这就是为什么你甚至不必将它转换为原生的endianess。

为什么这样做以及为什么有必要:

如果您连接到localhost127.0.0.1,则getpeername将始终生成地址127.0.0.1(显然转换为无符号长号)。 这意味着,你可以检查htonl(2130706433);并完成它(注意结束)。但是,如果您输入实际地址...或您的NIC可能具有的任何其他本地地址,getpeername将返回该地址,而不是127.0.0.1。

getsockname将返回此套接字所连接的本地接口,这意味着它将选择正确的接口并告诉您其地址,只有在您从本地计算机连接时才相等。< / p>

我希望这会对某人有所帮助,因为我必须永远搜索才能找到这些信息。 它应该适用于大多数常见情况。 (有一些例外)

例外情况:

多地址网卡。它们位于同一台计算机上,但要么不在同一个NIC上,要么绑定到不同的IP。你无能为力。

在不同于127.0.0.1的IP上调用localhost。 getsockname将始终返回127.0.0.1,无论您调用哪个127.x.x.x.作为一名后卫&#39;对此,您可以专门检查对等地址的第一个八位字节中的127。

非常感谢你帮助这个问题。