所有分数求教…………………………

何鲁青 2005-06-06 10:48:22
想要做一个程序,探知一个未知IP的机器的IP地址;
目前的想法是截获那台未知IP机器发出的IP数据包,然后从中获取他的IP,不知道该怎么做,或者那位高手能够指点一个更好的实现方法,最后的一点分数,全部放出来,希望不要嫌少!!!!
再现等待……
...全文
647 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
jenycheng 2005-07-15
  • 打赏
  • 举报
回复
这个帖子一定要留住!!!


MARK以下

以后留着看!!!
何鲁青 2005-06-17
  • 打赏
  • 举报
回复
这里的分有个p用哦
////////////////
知识问答,这句话里p表示什么意思?
回答正确就给分...-_-!!
foolishidea 2005-06-16
  • 打赏
  • 举报
回复
uses WinSock2

const
SIO_RCVALL = IOC_IN or IOC_VENDOR or 1;
jinhaiwu 2005-06-16
  • 打赏
  • 举报
回复
不要老是 解决问题就给分。。。。。。。。。。。。。。
这里的分有个p用哦
我感觉还是一个角比较爽
jinhaiwu 2005-06-16
  • 打赏
  • 举报
回复
{ Protocols }

{$EXTERNALSYM IPPROTO_IP}
IPPROTO_IP = 0; { dummy for IP }
{$EXTERNALSYM IPPROTO_ICMP}
IPPROTO_ICMP = 1; { control message protocol }
{$EXTERNALSYM IPPROTO_IGMP}
IPPROTO_IGMP = 2; { group management protocol }
{$EXTERNALSYM IPPROTO_GGP}
IPPROTO_GGP = 3; { gateway^2 (deprecated) }
{$EXTERNALSYM IPPROTO_TCP}
IPPROTO_TCP = 6; { tcp }
{$EXTERNALSYM IPPROTO_PUP}
IPPROTO_PUP = 12; { pup }
{$EXTERNALSYM IPPROTO_UDP}
IPPROTO_UDP = 17; { user datagram protocol }
{$EXTERNALSYM IPPROTO_IDP}
IPPROTO_IDP = 22; { xns idp }
{$EXTERNALSYM IPPROTO_ND}
IPPROTO_ND = 77; { UNOFFICIAL net disk proto }
何鲁青 2005-06-16
  • 打赏
  • 举报
回复
终于搞定了,能够获取IP数据报了,谢谢楼上的各位高手。
现在有个问题是
TIPHeader = packed record
iph_verlen: byte; // Version and length
iph_tos: byte; // Type of service
iph_length: word; // Total datagram length
iph_id: word; // Identification
iph_offset: word; // Flags, fragment offset
iph_ttl: byte; // Time to live
iph_protocol: byte; // Protocol
iph_xsum: word; // Header checksum
iph_src: longword; // Source address
iph_dest: longword; // Destination address
end;
这里的iph_protocol: byte;给我的是一个byte类型的编号,
不知道谁有编号对应的表,让我查出来到底是什么通信协议
解决问题就给分...
何鲁青 2005-06-15
  • 打赏
  • 举报
回复
本来想省事的,没想到弄巧成拙,我分开写写看,如果成功就给分了...
jinhaiwu 2005-06-15
  • 打赏
  • 举报
回复
晕啊,函数分开写多好,为什么要合并到一起。。。。。。。。。
何鲁青 2005-06-15
  • 打赏
  • 举报
回复
我仿佛明白了,应该了写成两个函数对不对?
何鲁青 2005-06-15
  • 打赏
  • 举报
回复
获得IP那段是从这个函数改过去的
/////////////////////////////////////
uses winsock;

function MyForm.NetGetLocalIP(var LocalIp,LocalHostName: string): Boolean;
var
HostEnt: PHostEnt;
Ip: string;
addr: pchar;
strName: string;
Buffer: array [0..63] of char;
GInitData: TWSADATA;
begin
Result := False;
try
WSAStartup(2, GInitData);
GetHostName(Buffer, SizeOf(Buffer));
HostEnt := GetHostByName(buffer);

if HostEnt = nil then Exit;
LocalHostName:=StrPas(HostEnt^.h_name);
addr := HostEnt^.h_addr_list^;
ip := Format('%d.%d.%d.%d', [byte(addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
LocalIp := Ip;
Result := True;
finally
WSACleanup;
end;
end;
何鲁青 2005-06-15
  • 打赏
  • 举报
回复
我把代码贴出来吧,你帮忙给看看
/////////////////////////
procedure TForm1.FormCreate(Sender: TObject);
var iErrorCode:integer;
wsd:TWSADATA;
host:sockaddr_in;
Buffer: array [0..63] of char;
HostEnt: PHostEnt;
bopt:integer;
begin
if WSAStartup(MAKEWORD(2,2),wsd)=0 then
begin
MySocket:=socket( AF_INET , SOCK_RAW , IPPROTO_IP );//------------------ipproto_raw
if MySocket<>INVALID_SOCKET then
begin
bopt:=1;
iErrorCode:=setsockopt(MySocket, SOL_SOCKET, SO_RCVTIMEO, @bOpt, sizeof(bOpt));
if iErrorCode<>SOCKET_ERROR then
begin
GetHostName(Buffer, SizeOf(Buffer));
HostEnt:=GetHostByName(Buffer);
if HostEnt <> nil then
begin
showmessage(HostEnt^.h_name);
Host.sin_addr:=in_addr(HostEnt^.h_addr_list);
//Host.sin_addr:=Inet_addr(pchar(FActiveIP[i]));
Host.sin_family:=AF_INET;
Host.sin_port:=htons(7000);
if bind(MySocket, Host, sizeof(Host))<>SOCKET_ERROR then showmessage('网卡绑定成功!!!')
else
begin
showmessage('错误类型:'+IntToStr(WSAGetLastError));
//WSAEADDRNOTAVAIL 10049 Cannot assign requested address.
end;
end;
end
else showmessage('设置网卡属性时失败!!');
end;
end;
end;
jinhaiwu 2005-06-15
  • 打赏
  • 举报
回复
ginitdata: twsadata;

要调用 wsastartup(2, ginitdata);进行初始化


最后要释放 wsacleanup;


何鲁青 2005-06-15
  • 打赏
  • 举报
回复
我用这种方法获取IP的,不知道为什么不对
GetHostName(Buffer, SizeOf(Buffer));
HostEnt:=GetHostByName(Buffer);
Host.sin_addr:=in_addr(HostEnt^.h_addr_list);
jinhaiwu 2005-06-15
  • 打赏
  • 举报
回复
TWSAIoctl = function(s: TSocket; cmd: DWord; lpInBuffer: PCHAR;
dwInBufferLen: DWord; lpOutBuffer: PCHAR; dwOutBufferLen: DWord;
lpdwOutBytesReturned: LPDWORD; lpOverLapped: POINTER;
lpOverLappedRoutine: POINTER): Integer; stdcall;

WSAIoctl:TWSAIoctl ;
dwBufferLen: array[0..10] of DWord;
dwBufferInLen: DWord;
dwBytesReturned: DWord;

dwBufferInLen := 1;
dwBytesReturned := 0;
//设置Fsocket为SIO_RCVALL接收所有的IP包
iErrorCode := FWSAIoctl(Fsocket[i], SIO_RCVALL, @dwBufferInLen,
sizeof(dwBufferInLen),
@dwBufferLen, sizeof(dwBufferLen), @dwBytesReturned, nil, nil);



jinhaiwu 2005-06-15
  • 打赏
  • 举报
回复
我是监听机器上的所有ip,才用数组的
jinhaiwu 2005-06-15
  • 打赏
  • 举报
回复
你机器的监听ip
何鲁青 2005-06-15
  • 打赏
  • 举报
回复
FActiveIP[i]是从哪里得到的?就是这个地方不明白呀!!!
何鲁青 2005-06-15
  • 打赏
  • 举报
回复
谢谢楼上的,我感觉这就是我要找的,试一下,希望你继续关注这个帖子...
jinhaiwu 2005-06-15
  • 打赏
  • 举报
回复

sa: tSockAddrIn;
iErrorCode :integer ;


Fsocket[i] := socket(AF_INET, SOCK_RAW, IPPROTO_IP);
sa.sin_family := AF_INET;
sa.sin_port := htons(i);
sa.sin_addr.S_addr := Inet_addr(pchar(FActiveIP[i]));
iErrorCode := bind(Fsocket[i], sa, sizeof(sa));
if(iErrorCode <> SOCKET_ERROR )then..............
何鲁青 2005-06-15
  • 打赏
  • 举报
回复
一大早up一下,进来的跟我说说怎样绑定端口把,我的总是出错误,
GetHostName(Buffer, SizeOf(Buffer));
HostEnt:=GetHostByName(Buffer);
if HostEnt <> nil then
begin
showmessage(HostEnt^.h_name);
Host.sin_addr:=TInAddr(HostEnt^.h_addr_list);//可能是这里的毛病
Host.sin_family:=AF_INET;
Host.sin_port:=htons(7000);
if bind(MySocket, Host, sizeof(Host))<>SOCKET_ERROR then showmessage('网卡绑定成功!!!')
else
begin
showmessage('错误类型:'+IntToStr(WSAGetLastError));
//WSAEADDRNOTAVAIL 10049 Cannot assign requested address.
end;
end;
//////////我定义了一个错误位置,但是不知道怎样才能找到解决办法,大家如果做过socket编程,肯定都应该知道怎么去获得本机的网卡,地址,然后去绑定他的,帮忙看看吧,那么长时间都弄不出来,太没面子了...
加载更多回复(41)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧