怎么通过发udp包获得当前局域网的所有计算机IP地址?

gqxs 2003-03-10 08:41:15
高手指教,不胜感谢!
...全文
310 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowCan 2003-03-13
  • 打赏
  • 举报
回复
这样又要用libnet库了。
gqxs 2003-03-13
  • 打赏
  • 举报
回复
以本地主机的名义(本地主机的ip和mac)向指定ip网段内的所有主机发送广播(ff:ff:ff:ff:ff:ff)ARP Request数据报,存活的主机就会发送ARP Reply数据报,这样就可以获得当前存活主机的列表。
猛禽 2003-03-11
  • 打赏
  • 举报
回复
netstat只是取得当前所有连到本机的地址,而不是连在网上的地址
gqxs 2003-03-11
  • 打赏
  • 举报
回复
可能了解netstat的原理可以解决这个问题
gqxs 2003-03-11
  • 打赏
  • 举报
回复
现在觉的应该研究一下arp
NowCan 2003-03-10
  • 打赏
  • 举报
回复
有这么牛的事?
如果对方是Windows系统,并且有BIOS名字解析,可以向UDP137端口发一个数据包,返回的数据包里有对方的名字。

其实,按理说来个广播ping,所有的计算机都回应一下就可以了。但是不幸的是所有Windows平台都不回应广播ping。
猛禽 2003-03-10
  • 打赏
  • 举报
回复
Linux应该是不会理睬137端口的,要通用的话,只有PING
gqxs 2003-03-10
  • 打赏
  • 举报
回复
应该可以,我有一个做好乐的exe,连连接的网站ip都可以查出来
NowCan 2003-03-10
  • 打赏
  • 举报
回复
问题就是计算机不回应广播呀,怎么办?NetBios的方法就是上面那个了。但是这个方法对Linux好像不行。
gqxs 2003-03-10
  • 打赏
  • 举报
回复
具我所知,有个想法是发个广播,让所有收到广播的计算机都回发一个广播,这样来知道整个局域网的计算机ip。据说是可以实现的。
jhsu 2003-03-10
  • 打赏
  • 举报
回复
不一个一个来是不行的,因为windows的netbios不支持广播,而且广播也不能跨网段。
其实上面的程序就是Netbios()函数之内核,直接使用Netbios()函数也可以,只是它的等待时间要长的多。
WhyAndAnswer 2003-03-10
  • 打赏
  • 举报
回复
learning...
gqxs 2003-03-10
  • 打赏
  • 举报
回复
我就是不想一个一个去ping,还有办法吗?
也许不是用udp广播包,用netbios也可能的,在等等
jhsu 2003-03-10
  • 打赏
  • 举报
回复
最近刚好写了一个。
给你点提示:
Port:137
定义结构:
struct nbname_request {
WORD transaction_id;
WORD flags;
WORD question_count;
WORD answer_count;
WORD name_service_count;
WORD additional_record_count;
char question_name[34];
WORD question_type;
WORD question_class;
};
赋值:
request.transaction_id = 0;
request.flags = htons(0x0010);
request.question_count = htons(1);
request.answer_count = 0;
request.name_service_count = 0;
request.additional_record_count = 0;
strcpy(request.question_name," CKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
request.question_type = htons(0x21);
request.question_class = htons(0x01);

......

发送:
if(sendto(s,(char *)&request,sizeof(request),0,(sockaddr FAR*)&socket_out,sizeof(socket_out)) == SOCKET_ERROR)
{
return NULL;
}
等待:
switch(WSAWaitForMultipleEvents(1,&event_obj,true,wait_time,true))
{
default:
return NULL;
case WSA_WAIT_EVENT_0:;
}
接收:
size = recvfrom(s,(char FAR*)buffer,1024,0,(sockaddr FAR*)&socket_recv,(int FAR*)&recv_len);
if(size > 0)
{
......
}
在buffer中有许多有用的东西。

需要挨个IP去试,设置wait_time为5ms,重复3次,则查询全部254个IP需时最大3.8s,如果有多个网段,可使用多线程。

需要Source Code的话可以回复我,不过要先给分喔。

l_clove 2003-03-10
  • 打赏
  • 举报
回复
来个循环ping,呵呵
要不在所有机器上装个自己写的服务,你肯定不干
albeta 2003-03-10
  • 打赏
  • 举报
回复
在自己所在的字网内ping一下其他全部机器不就可以了?

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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