Indy tcp服务器 - 确定服务器的IP和端口

3 delphi indy indy10

如何使用delphi确定IdTcpServer的'internet'ip和端口?不是本地(127.0.0.1或192.168.0.1),而是公共互联网.

War*_* P 8

端口和绑定

端口号很容易确定,如果你想检查TIdTcpServer,你会发现它有一个DefaultPort属性,Bindings所以如果你问它是什么端口"接受连接",它应该是DefaultPort,或者配置的任何东西在里面Bindings.会话激活后,该会话将在其自己的动态分配的端口号上处于活动状态.
如果在我的应用程序中,我将IdTcpServer1.DefaultPort设置为90,然后在运行时转储绑定的内容我得到此列表:

0.0.0.0:90
0:0:0:0:0:0:0:0:90
Run Code Online (Sandbox Code Playgroud)

上面显示所有零的列表是IP地址 - 通配符表示法,告诉我我正在侦听端口90上所有可用的本地IPV4和IPV6地址.我用来转储上面列表的代码是:

procedure DumpBindings;
var
 n:Integer;
begin
   for n := 0 to IdTCPServer1.Bindings.Count-1 do begin
     with IdTCPServer1.Bindings[n] do begin
        Memo1.Lines.Add( ip+':'+IntToStr(Port) );
     end;
   end;
end;
Run Code Online (Sandbox Code Playgroud)

公共IP地址

因此,对于本问题的其余部分,我们只返回IP地址,并忽略端口:

您的计算机可能有以太网卡或无线网络适配器,或两者兼而有之,两者中的任何一个都可以拥有自己的私有地址.其次,如果您是网络管理员并且已经提供了一个公共IP,则计算机中的任何网络适配器也可能具有公共IP.如果您没有配置您正在使用的网络,那么您在计算机上使用公共可访问的IP的可能性非常小.

如果你第一次看到这里告诉你如何确定你的计算机可以访问哪些IP(枚举所有本地IP),你的问题会更好.然后你可以问一个关于过滤该列表的问题,并通过丢弃私有不可路由的地址来找到正确的列表.除了我打赌它不适用于你的情况......让我们弄清楚为什么......

如果您是普通的家庭或企业桌面PC用户,谁在您的PC上使用私人IP地址,并且您的互联网连接通过网络地址转换(NAT)发生,那么答案是您的PC甚至没有公开演讲.

可以配置基于NAT的路由器来转发端口,但我不知道该转发的接收者是否有任何方法可以知道存在转发到您的计算机的端口.如果您需要帮助在家中配置基于NAT的DSL或电缆调制解调器以将端口转发到Delphi应用程序,那么在其他地方询问这将是一个更好的问题.

  • +1非常好的答案! (2认同)
  • 事实证明,OP正在询问如何找到他本地连接的DSL调制解调器的IP地址.所以相关的问题应该有效,因为他接受了答案,我猜它对他有用.其他未来的读者可能不那么容易开心. (2认同)