<font size="+3" color="red">多IP该如何处理?</font>(200分)

  • 主题发起人 主题发起人 Delphi On Me
  • 开始时间 开始时间
D

Delphi On Me

Unregistered / Unconfirmed
GUEST, unregistred user!
拨号上网时,或者安装有多个网卡时,一台机器会对应多个IP地址,
这时如果想知道与某一个目标地址通信所用的本地IP地址,该怎么写代
码?
我自己写了一段,要求是用UDP传输,如下:
hsk := socket(AF_INET, SOCK_DGRAM, 0);
if hsk &lt;&gt; -1 then
begin
sdr.sin_addr.s_addr := INADDR_ANY;
sdr.sin_family := AF_INET;
sdr.sin_port := 0;
size := sizeof(sdr);
if bind(hsk, sdr, size) &gt;= 0 then
begin
sdr.sin_family := AF_INET;
sdr.sin_port := htons(5000);
sdr.sin_addr.S_addr := inet_addr(PChar('192.168.26.111'));
size := sizeof(sdr);
if connect(hsk, sdr, size) &lt;&gt; -1 then
begin
size := sizeof(sdr);
sdr.sin_family := AF_INET;
if getsockname(hsk,sdr,size)&gt;=0 then
begin
IP := Strpas(inet_ntoa(sdr.sin_addr));
Port := ntohs(sdr.sin_port);
closesocket(hsk);
end;
end;
end;
end;
但是得到的IP是'0.0.0.0',不知道哪儿写错了,麻烦各位指点一下。
 
if getsockname(hsk,sdr,size)&gt;=0 then
^gethostbyname行不行?
 
可是如果有多个IP时,gethostbyname管用吗?
 
你到底要干什么?要得到本地ip地址?还是UDP连接?
UDP连接怎么会有connect?本地ip地址得话,你为什么要用BIND?
如果仅仅想把本地得ip地址全取出来,根本不用这么做啊?

type
pIn_Addr= ^TIn_Addr;

str:array[0..10] of string;
wsahostname:string:;
i:integer;
wsaData:TWSAData;
wsahostent:^THostent;;
if (WSAStartup($0202,&amp;wsaData) &lt;&gt; 0) then
begin
showMessage("初始化服务器失败,请关闭应用程序");
close;
end;

if(gethostname(wsahostname,sizeof(hostent))&lt;&gt;0) then
begin
showMessage("读取主机名错误!");
close;
end;

wsahostent = gethostbyname(wsahostname);
if(wsahostent == nil)begin
showMessage("读取主机IP地址错误!");
close;
end;

i=0
while(wsahostent-&gt;h_addr_list&lt;&gt;nil) do begin
str = inet_ntoa (pin_addr(wsahostent-&gt;h_addr_list^));
inc(i);
end;
 
我不是要取出所有的IP。
比如我的网卡的IP是192。168。26。123
而拨号上网后,又有另外一个IP,比如是:202。102。107。11
这时我想与202。102。110。12用UDP通信,
我想把我的IP传给对方,这时我应该怎么判断我用的是哪个IP呢?
上一段代码我也是参考别人的,就是这么写的。
 
可是你为什么要送给他你的ip地址呢?他再收到你的数据报的同时,就知道你
的ip地址的啊,如果你对ip包的机构有所了解的话,我想你会明白的,不管怎么说,
你这么改一下试试
IP := Strpas(inet_ntoa(sdr.sin_addr.S_addr));
 
是的,对方确实可以知道我的IP。
但是我还是想自己也能知道,呵呵!
 
改成IP := Strpas(inet_ntoa(sdr.sin_addr.S_addr));
语法检查通不过
 
看看绑定什么协议!!
 
我想用的是UDP协议。
 
你根本没有发送过去udp包,怎么能获得ip地址?如下试试。
还得看你的服务器端是否收到ip包。

type
pSockAddr = ^TSockAddrIn;

hsk := socket(AF_INET, SOCK_DGRAM, 0);
if hsk &lt;&gt; -1 then
begin
sdr.sin_addr.s_addr := INADDR_ANY;
sdr.sin_family := AF_INET;
sdr.sin_port := 0;
size := sizeof(sdr);
if bind(hsk, sdr, size) &gt;= 0 then
begin
sdr.sin_family := AF_INET;
sdr.sin_port := htons(5000);
sdr.sin_addr.S_addr := inet_addr(PChar('192.168.26.111'));
size := sizeof(sdr);
sentlen=sendto(hsk,buf,strlen(buf),0,(pSockAddr)&amp;sdr,size);
if getsockname(hsk,sdr,size)&gt;=0 then
begin
IP := Strpas(inet_ntoa(sdr.sin_addr));
Port := ntohs(sdr.sin_port);
closesocket(hsk);
end;
end;
end;
 
试试先。
 
没有用啊,还是'0.0.0.0'.
 
谁说udp就不可以先connect,UDP中的CONNECT只是一个虚操作而已!
 
接受答案了.
 
后退
顶部