对于项目,我需要知道网络连接是来自本地计算机还是来自远程计算机。
如何实现这一目标?
答案 0 :(得分:5)
这可以通过使用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);
}
结果的结尾始终是相同的,这就是为什么你甚至不必将它转换为原生的endianess。
为什么这样做以及为什么有必要:
如果您连接到localhost
或127.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。
非常感谢你帮助这个问题。