Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何检查套接字客户端服务器是否在同一网络上?_Delphi_Sockets_Indy - Fatal编程技术网

Delphi 如何检查套接字客户端服务器是否在同一网络上?

Delphi 如何检查套接字客户端服务器是否在同一网络上?,delphi,sockets,indy,Delphi,Sockets,Indy,我正在使用socket,为此我使用了TIdTCPClient和TIdTCPServer。 我需要检查TIdTCPClient连接的TIdTCPServer是否在同一网络上 我该怎么做 在。你说的“同一网络”是什么意思?您可以模拟traceroute实用程序,检查跳数(以及它们的路由器地址),并与预期的跳数进行比较。您需要知道客户端的子网掩码才能进行这种比较。套接字不公开该信息,因此您必须直接询问操作系统(例如,在Windows上,您可以在getAdapterInfo()或GetAdapterAd

我正在使用socket,为此我使用了TIdTCPClient和TIdTCPServer。 我需要检查TIdTCPClient连接的TIdTCPServer是否在同一网络上

我该怎么做


在。

你说的“同一网络”是什么意思?您可以模拟traceroute实用程序,检查跳数(以及它们的路由器地址),并与预期的跳数进行比较。

您需要知道客户端的子网掩码才能进行这种比较。套接字不公开该信息,因此您必须直接询问操作系统(例如,在Windows上,您可以在
getAdapterInfo()
GetAdapterAddresses()
返回的列表中查找客户端连接的本地IP)。一旦你有了掩码,你就可以用它来屏蔽客户端的IP和服务器的IP,看看结果值是否相同。

Tks for hits,为了解决我的问题,我只需要验证主机是否是本地主机

解决方案:

function IsLocalHost(AHost : string) : Boolean;
var
  LStrRegexRedeLocal : string;
begin
  if LowerCase(AHost) = 'localhost' then
    result := True
  else
  begin
    LStrRegexRedeLocal := '(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)|(^127\.0\.0\.1)';
    result := ExecRegExpr(LStrRegexRedeLocal, AHost);
  end;
end;

只是为了完成(clientip和netmask)=(destinationip和netmask)是的。对于IPv4 IP,无论如何(GetAdapterInfo()仅支持IPv4)。ipv6ips会变得更复杂一些,那将是相同的“子网”而不是相同的“网络”。网络是一个更广泛的定义,整个公司的LAN网络可以由几个子网组成。好了,没有直接的方法来确定本地网络上还有哪些子网可用,只有本地子网是什么。在这方面,那么是的,需要一条追踪路线。如果它在遇到服务器的IP之前遇到了网络的公共Internet IP,则服务器不在本地网络上。Tks for hits,为了解决我的问题,我只需要验证主机是否为本地主机。解决方案:函数IsLocalHost(AHost:string):布尔;var LStrRegexRedeLocal:字符串;如果小写字母(AHost)=“localhost”,则开始,然后结果:=True,否则开始lstrgexredelocal:=”(^10”)(^172.1[6-9]\)(^172.2[0-9]\)(^172.3[0-1]\)(^192.168”)(^127.0.0.1)”;结果:=ExecRegExpr(LStrRegexRedeLocal,AHost);结束;结束;