这可以通过利用getpeername和getsockname功能来实现.
这个剪切完全符合我的需要:
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.
为什么这样做以及为什么有必要:
如果连接到localhost或127.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.
非常感谢对此的帮助.