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

Ref*_*ium 5 c++ sockets tcp

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

怎么做到这一点?

Ref*_*ium 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);
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

getsockname 将返回此套接字连接的本地接口,这意味着它将选择正确的接口并告诉您其地址,仅当您从本地计算机连接时才相等.

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

例外列表:

多地址网卡.它们位于同一台计算机上,但要么不在同一个NIC上,要么绑定到不同的IP.关于那个你没有那么多.

在不同于127.0.0.1的IP上调用localhost.getsockname将始终返回127.0.0.1,无论您调用的是哪个127.xxx.作为对此的'保护',您可以专门检查对等地址的第一个八位字节中的127.

非常感谢对此的帮助.