B
bluepoint8868
Unregistered / Unconfirmed
GUEST, unregistred user!
我最近搞了一个网络视频实时直播系统!
本地的机器(预装摄像头)采集的图像通过Indy控件传播到指定IP的客户端。本程序在独立
拨号的机器上验证通过。但是如果客户端或者服务器端在局域网内,那么就出现错误。分析其原因,发现错误在获取IP地址的时候!我是如此来取得本地客户端机器的IP,并显示在Edit1中的:
procedure TForm1.FormCreate(Sender: TObject);
var
IPList: TStrings;
begin
IPList := GStack.LocalAddresses.Create;
TCPServer.Bindings.Clear;
if IPList.Count > 0 then
begin
Binding := TCPServer.Bindings.Add;
Binding.IP := IPList.Strings[IPList.Count - 1];
Edit1.Text := Binding.IP;
end;
end;
好了,问题来了,我的机器是局域网内的,所以Edit1中显示的是:192.168.....(局域网IP)
如果我的机器是独立拨号的(自动获取IP),那么Edit1中显示的是:211.90.....(公网IP)
当客户端(局域网内)向服务器端(公网上)发送本地IP的时候,如果客户端和服务器端不在同一个局域网内,那么服务器端必然提示192.168....提示连接不上。
根据网络机制,上网的机器不管是采用何种方式,必然有一个公网IP,独立拨号的时候,用上述方法可以取得公网IP,但是如果我是局域网内的用户(通过路由或者服务器中转),用上述方法只能取得局域网内本地机器的IP,我的问题是如何取得局域网内机器的公网IP?
本地的机器(预装摄像头)采集的图像通过Indy控件传播到指定IP的客户端。本程序在独立
拨号的机器上验证通过。但是如果客户端或者服务器端在局域网内,那么就出现错误。分析其原因,发现错误在获取IP地址的时候!我是如此来取得本地客户端机器的IP,并显示在Edit1中的:
procedure TForm1.FormCreate(Sender: TObject);
var
IPList: TStrings;
begin
IPList := GStack.LocalAddresses.Create;
TCPServer.Bindings.Clear;
if IPList.Count > 0 then
begin
Binding := TCPServer.Bindings.Add;
Binding.IP := IPList.Strings[IPList.Count - 1];
Edit1.Text := Binding.IP;
end;
end;
好了,问题来了,我的机器是局域网内的,所以Edit1中显示的是:192.168.....(局域网IP)
如果我的机器是独立拨号的(自动获取IP),那么Edit1中显示的是:211.90.....(公网IP)
当客户端(局域网内)向服务器端(公网上)发送本地IP的时候,如果客户端和服务器端不在同一个局域网内,那么服务器端必然提示192.168....提示连接不上。
根据网络机制,上网的机器不管是采用何种方式,必然有一个公网IP,独立拨号的时候,用上述方法可以取得公网IP,但是如果我是局域网内的用户(通过路由或者服务器中转),用上述方法只能取得局域网内本地机器的IP,我的问题是如何取得局域网内机器的公网IP?