您的位置:首页 > 其它

在局域网中,知道对方的电脑名字,怎么得到IP地址

2009-06-28 11:32 555 查看
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
winsock;
const
err_netnotready=$ffff;
err_range=10000;
type
tAddr=array[1..4] of byte;
tsin=TSOCKADDRin;
const
all_send=0;
single_send=1;
var
gs,gr:tsocket;
gsin:tsin;
gtd:taddr;
gmy_name:string;
gsend_type:integer;
grecv_type:integer;
function bind_socket(var s:tsocket;var sin:tsockaddrin):integer;
function get_socket(var s:tsocket;sock_type:integer):integer;
function get_dest_addr(name:string;var sin:TSOCKADDRin;var td:taddr):integer
;
function get_host_name:string;
function get_host_addr(var sin:TSOCKADDRin;var td:taddr):integer;
function get_my_addr:taddr;
function connect_des(s:tsocket;name:string;var sin:TSOCKADDRin;var td:taddr)
:integer;
function sendmsgto(client:string;msg:string):integer;
function recvmsgfrom(VAR client:string;var msg:string):integer;
function check_peername(client:string):integer;
implementation
function bind_socket(var s:tsocket;var sin:tsockaddrin):integer;
var
i,res:integer;
alport:integer;
begin
alport:=IPPORT_RESERVED;
for i:=1 to IPPORT_RESERVED div 2 do
begin
sin.sin_port:=htons(alport);
RES:=BIND(S,SIN,SIZEOF(SIN));
if res=0 then break;
alport:=alport-1;
end;
if res<>0 then res:=wsagetlasterror;
bind_socket:=res;
end;
function get_socket(var s:tsocket;sock_type:integer):integer;
var
af,typ,procol:integer;
wsdata:twsadata;
wver:word;
res:integer;
begin
af:=PF_INET;
TYP:=sock_type;
PROCOL:=0;
wver:=makeword(1,1);
res:=wsastartup(wver,wsdata);
s:=socket(af,typ,procol);
get_socket:=res;
end;
function get_dest_addr(name:string;var sin:TSOCKADDRin;var td:taddr):integer
;
var
i,alport:integer;
st:string;
hp:phostent;
server:array[1..80] of char;
begin
fillchar(td,sizeof(td),0);
i:=sizeof(server);
fillchar(server,sizeof(server),0);
st:=name;
move(st[1],server,length(st));
hp:=gethostbyname(@server);
if hp=nil then
begin
get_dest_addr:=-1;
exit;
{halt;}
end;
move(hp^.h_addr_list^,sin.sin_addr.s_addr,hp^.h_length);
SIN.SA_FAMILY:=hp^.h_addrtype;
alport:=IPPORT_RESERVED;
sin.sin_port:=htons(alport);
sin.sin_addr.s_un_b.s_b1:=hp^.h_addr_list^[0];
sin.sin_addr.s_un_b.s_b2:=hp^.h_addr_list^[1];
sin.sin_addr.s_un_b.s_b3:=hp^.h_addr_list^[2];
sin.sin_addr.s_un_b.s_b4:=hp^.h_addr_list^[3];
move(hp^.h_addr_list^[0],td[1],4);
end;
function get_host_name:string;
var
i:integer;
hp:phostent;
server:array[1..80] of char;
begin
i:=sizeof(server);
gethostname(@server,i);
hp:=gethostbyname(@server);
get_host_name:=hp^.h_name;
end;
function get_host_addr(var sin:TSOCKADDRin;var td:taddr):integer;
var
i,alport:integer;
st:string;
hp:phostent;
server:array[1..80] of char;
begin
fillchar(td,sizeof(td),0);
i:=sizeof(server);
gethostname(@server,i);
hp:=gethostbyname(@server);
move(hp^.h_addr_list^,sin.sin_addr.s_addr,hp^.h_length);
SIN.SA_FAMILY:=hp^.h_addrtype;
alport:=IPPORT_RESERVED;
sin.sin_port:=htons(alport);
sin.sin_addr.s_un_b.s_b1:=hp^.h_addr_list^[0];
sin.sin_addr.s_un_b.s_b2:=hp^.h_addr_list^[1];
sin.sin_addr.s_un_b.s_b3:=hp^.h_addr_list^[2];
sin.sin_addr.s_un_b.s_b4:=hp^.h_addr_list^[3];
move(hp^.h_addr_list^[0],td[1],4);
end;
function get_my_addr:taddr;
VAR
s:tsocket;
RES:INTEGER;
td:taddr;
SIN:TSOCKADDRin;
begin
get_socket(gs,SOCK_dgram);
get_host_addr(sin,td);
bind_socket(gs,sin);
move(sin.sin_addr.s_addr,result,4);
{ closesocket(gs);}
{******}
end;
function connect_des(s:tsocket;name:string;var sin:TSOCKADDRin;var td:taddr)
:integer;
VAR
i,res:INTEGER;
st:string;
alport:integer;
begin
get_dest_addr(name,sin,td);
RES:=connect(S,SIN,SIZEOF(SIN));
if res=0
then
connect_des:=res
else
connect_des:=wsagetlasterror;
end;
function sendmsgto(client:string;msg:string):integer;
var
st:string;
i,res:integer;
sin:tsockaddrin;
td:taddr;
ts:tsocket;
t1:double;
buf:array[1..10] of byte;
l:integer;
begin
st:=gmy_name+':'+msg;
get_socket(ts,sock_dgram);
get_host_addr(sin,td);
bind_socket(ts,sin);
get_dest_addr(client,sin,td);
if gsend_type=all_send then
begin
st:=char(255)+st;
sin.sin_addr.s_un_b.s_b1:=char($ff);
sin.sin_addr.s_un_b.s_b2:=char($ff);
sin.sin_addr.s_un_b.s_b3:=char($ff);
sin.sin_addr.s_un_b.s_b4:=char($ff);
end
else
st:=char(0)+st;
fillchar(buf,sizeof(buf),0);
buf[1]:=1;l:=sizeof(buf);
res:=setsockopt(ts,sol_socket,SO_BROADCAST,
pchar(@buf),l);
{ repeat
setlength(st,10000);
fillchar(st[1],10000,'a');
res:=sendto(ts,st[1],length(st),0,sin,sizeof(sin));
until false;}
res:=sendto(ts,st[1],length(st),0,sin,sizeof(sin));
if res=-1 then
begin
res:=wsagetlasterror;
closesocket(ts);
halt;
end;
t1:=time;
repeat
until (time-t1)>0.000001574;
sendmsgto:=res;
closesocket(ts);
end;
function recvmsgfrom(VAR client:string;var msg:string):integer;
var
st:string;
t,i,j,res:integer;
sin:tsockaddrin;
td:taddr;
buf:array[1..10] of byte;
l:integer;
hp:phostent;
ts:tsocket;
t1:double;
begin
{ td:=get_my_addr;}
{closesocket(gs);}
{ get_my_addr;}
{ get_socket(ts,sock_dgram);}
{ get_host_addr(sin,td);
bind_socket(gs,sin);
{ get_my_addr;}
{ get_host_addr(sin,td);
bind_socket(gs,sin);}
{get_dest_addr(client,sin,td);}
closesocket(gs);
{ wsacleanup;}
td:=get_my_addr;
i:=1;j:=sizeof(sin);t:=0;
fillchar(buf,sizeof(buf),0);
buf[1]:=1;l:=sizeof(buf);
res:=setsockopt(gs,sol_socket,SO_rcvtimeo,
pchar(@buf),l);
res:=wsagetlasterror;
inc(t);
SETLENGTH(ST,3000);
{ fillchar(sin,sizeof(sin),0);}
{ WSACancelBlockingCall;}
t1:=time;
repeat
until (time-t1)>0.0000001574*5;
res:=recvfrom(gs,ST[1],3000,0,sin,j);
IF (RES<3000) AND (RES>0) THEN
BEGIN
if st[1]=char(255)
then
grecv_type:=all_send
else
grecv_type:=single_send;
SETLENGTH(ST,RES);
move(sin.sin_addr.s_addr,td,4);
{ hp:=gethostbyaddr(@td,10,pf_inet);}
CLIENT:=COPY(ST,2,POS(':',ST)-2);
st:=copy(st,pos(':',st)+1,length(st)-length(client)-1);
end;
if res=-1 then
begin
res:=wsagetlasterror;
recvmsgfrom:=res;
exit;
end;
msg:=st;
recvmsgfrom:=length(st);
end;
function check_peername(client:string):integer;
begin
check_peername:=get_dest_addr(client,gsin,gtd);
end;
begin
gtd:=get_my_addr;
gmy_name:=get_host_name;
closesocket(gs);
wsacleanup;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: