【问题标题】:How to check if a socket client-server is on same network?如何检查套接字客户端服务器是否在同一网络上?
【发布时间】:2010-07-27 18:15:41
【问题描述】:

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

我该怎么做?

在。

【问题讨论】:

  • Tks for hits,为了解决我的问题,我只需要验证主机是否是本地主机。解决方案: function IsLocalHost(AHost : string) : Boolean; var LStrRegexRedeLocal : 字符串; 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)';结果:= ExecRegExpr(LStrRegexRedeLocal,AHost);结尾;结束;

标签: delphi sockets indy


【解决方案1】:

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

【讨论】:

  • 只是为了完整(clientip 和 netmask)=(destinationip 和 netmask)
  • 是的。对于 IPv4 IP,无论如何(GetAdaptersInfo() 仅支持 IPv4)。 IPv6 IP 会稍微复杂一些。
  • 那将是同一个“子网”而不是同一个“网络”。网络是一个更广泛的定义,整个公司的 LAN 网络可以由多个子网组成。
  • AFAIK,没有直接的方法可以确定本地网络上还有哪些其他子网可用,只能确定本地子网是什么。在这方面,是的,需要一个跟踪路由。如果在遇到服务器IP之前遇到网络的公网IP,那么服务器不在本地网络上。
【解决方案2】:

“同一网络”是什么意思?您可以模仿 traceroute 实用程序并检查有多少跃点(及其路由器地址),并与预期的进行比较。

【讨论】:

    【解决方案3】:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-05
      • 2019-09-17
      • 2012-04-21
      • 1970-01-01
      • 2021-12-21
      • 2012-11-12
      • 2021-09-11
      • 1970-01-01
      相关资源
      最近更新 更多