Indy+DSPACK解决视频采集和传输过程中遇到的问题! ( 积分: 200 )

  • 主题发起人 主题发起人 bluepoint8868
  • 开始时间 开始时间
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?
 
//客户端IP
//IdTCPServer1Execute事件
AThread.Connection.Socket.Binding.PeerIP;
 
to xianguo
还是一样的问题啊,AThread.Connection.Socket.Binding.PeerIP; 只能取得本地机器的局域网IP。(我知道也是可以取得公网IP的,前提条件是要独立拨号出去。)但是现在的情况是如果本地机器是有局域网IP的,我如何取得他的公网IP?
现在本地机器是可以上网的,我要完成视频传输,必然要取得他的公网IP。
 
//取得所有的IP,你可以将指定网段的过滤掉
uses WinSock;
function GetLocalIP: string;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;
begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^ <> nil do begin
if i=0
then result:=StrPas(inet_ntoa(pptr^^))
else result:=result+';'+#13+StrPas(inet_ntoa(pptr^^));
Inc(I);
end;
WSACleanup;
end;
 
to xianguo
编译通不过,能否留下直接联系方式,做进一步交流?
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Registry, DB, DBClient, WinSock ;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

function GetLocalIP: string;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;
begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^ <> nil do begin
if i=0
then result:=StrPas(inet_ntoa(pptr^^))
else result:=result+';'+#13+StrPas(inet_ntoa(pptr^^));
Inc(I);
end;
WSACleanup;
end;


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := GetLocalIP;
end;

end.
 
晕,Edit1中还是192.168......
还是局域网的IP啊!
我要的是公网的IP啊!
不可以实现吗?不少论坛显示我的IP是211.90......(这个才是我要的啊)
 
它是所有的IP列表,你修改GetLocalIP函数,使 192.168开头的地址都不列出就可以了
function GetLocalIP: string;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;
begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^ <> nil do begin
If Pos('192.168', StrPas(inet_ntoa(pptr^^)))=0 Then
begin
if result='' then result:=StrPas(inet_ntoa(pptr^^))
else result:=result+';'+#13+StrPas(inet_ntoa(pptr^^));
end;
Inc(I);
end;
WSACleanup;
end;
 
晕,Edit居然什么都没!
难道我的机器根本就没有公网IP??
我这里是通过路由给我分配IP的!
 
是否本身这个程序设计就有问题?
我现在采取的是本地摄像头采集。然后指定对方IP传输!
如果靠这种方式,是否从根本上就不能解决当前问题!
是否这样的方式更可靠:
本地采集的视频上传指定IP的公网服务器(作为流媒体服务器),然后,由客户端指定要访问的公网服务器地址(即该流媒体服务器)接受视频??
谁做过这样的程序?可否给点建议?
 
接受答案了.
 
后退
顶部