编写一个软件,目的是当局域网中的用户启动该软件时,
能在软件的界面上显示启动该软件的用户ip,类似飞鸽一样。
请问如何实现??
能在软件的界面上显示启动该软件的用户ip,类似飞鸽一样。
请问如何实现??
解决方案 »
- 请教:有关模态对话框成员变量赋值的问题
- 如何创建一个文件夹下的文件哦????
- 请问如何在VC++里调用其他的应用程序,比如notepad.exe,在线等待,急!!!!!!!!!!!
- 哪位大哥有XP下隐藏进程的好例子(hook api)
- 一个网络监控程序(类似Sinff),欢迎大家使用(没分)!
- 100分问:如何在视频数据和音频数据放在一块写入文件?音频用什么压缩算法呢?有没有人搞过这方面的东东?
- 小问题:在输入坐标后如何控制鼠标移动到那里?就想绘图软件一样?
- 请问,我想计算两次鼠标单击之间的时间间隔,用那种方法比较好呢?
- 请问各位高手,我在98下的程序编译正常,到2000下就出现如下错误,通不过?WHY???(不好意思,没分啦)
- 在线急 如何得到某一窗口的坐标
- 请问如何将24位真彩图转换为灰度图
- 关于进程的地址空间的问题
如果要获取一个连接使用的本机地址,用getsockname;获取对方地址用getpeername 。
但是如果要查找非网络邻居的ip方法就比较少了1.用ping,当然可以,但是如果要在程序中实现不大合理,而且我觉得速度也快不到哪里去
2.用winpcap发送arp请求包可以获得,但是获取时间不确定,而且获取速度不算太快
3.用SendARP函数,对于需要扫描255个主机时简直太慢了不能忍受,感觉程序都无法响应了。于是我尝试着?55个线程分别调用SendARP函数,结果发现大多数SendArp都调用失败,错误值是31。不知道为什么
4.看到网上有人使用先枚举网络资源,再获取主机信息,然后有主机名获取IP,最后由IP获取MAC的方法,我觉得速度也快不到哪里去(这个没有具体试过)
有个链接
http://blog.chinaunix.net/u2/64540/showart_654371.html
------------------还行吧,我测试过,1~254,全部获取也就花个7、8秒左右,而且我也只开了2个线程,一个发送(发送间隔20ms),一个接收,线程再多开几个估计还会快点
NETRESOURCE *NetResource = NULL;
HANDLE hEnum; WNetOpenEnum(dwScope, NULL, NULL, NULL, &hEnum); WSADATA wsaData; WSAStartup(MAKEWORD(1,1),&wsaData); if (hEnum)
{
DWORD Count = 0xFFFFFFFF;
DWORD BufferSize = 2048;
LPVOID Buffer = new char[2048]; WNetEnumResource(hEnum, &Count, Buffer, &BufferSize);
NetResource = (NETRESOURCE*)Buffer;
char szHostName[200]; for (UINT i = 0; i < BufferSize/sizeof(NETRESOURCE); i++, NetResource++)
{
if (NetResource->dwUsage == RESOURCEUSAGE_CONTAINER && NetResource->dwType == RESOURCETYPE_ANY)
{
if (NetResource->lpRemoteName)
{
CString strFullName = NetResource->lpRemoteName;
char buf[512];
if (0 == strFullName.Left(2).Compare("\\\\"))
strFullName = strFullName.Right(strFullName.GetLength()-2); gethostname(szHostName, strlen( szHostName )); //LOCAL COMPUTER NAME host = gethostbyname(strFullName); if (!host) continue; ptr = (struct in_addr *) host->h_addr_list[0]; sprintf(buf, "%d.%d.%d.%d", ptr->S_un.S_un_b.s_b1,
ptr->S_un.S_un_b.s_b2, ptr->S_un.S_un_b.s_b3, ptr->S_un.S_un_b.s_b4); }
}
}
delete Buffer;
WNetCloseEnum(hEnum);
}
WSACleanup();
gethostname(szLocal,255);
hostent* phost=gethostbyname(szLocal);
for (int i=0;;i++)
{
char* paddr=phost->h_addr_list[i];
if(paddr==NULL)
break; in_addr inaddr;
memcpy(&inaddr.s_addr,paddr,phost->h_length);
char* pip=inet_ntoa(inaddr);
printf("IPAddress:%s",pip);}
这段代码比较简单,直观一些
我的目的是获得所有启动该软件的局域网的IP
用SendARP函数方法时,获得的是局域网上所有的IP
而不是启动该软件的局域网的IP
1、你那个软件在启动后就启动向局域网内指定端口广播如13000端口,你可以使用周期性广播,广播的内容就是身份标识,你可以自己定。这些可以在一个线程内进行
2、再开一个线程,专门用于接收局域网内得广播(绑定上面指定的那个端口),通过广播得内容来判断是你这套软件的广播,另外通过接收套接字函数,你可以确定对方得IP ,这样就可以获得局域网中得你的软件运行机器上的IP 。也就是每个软件在启动后都发自己的身份广播,同时接收局域网内别的广播,这样你就可以像 飞鸽那样得到局域网内的运行飞鸽的电脑的IP 总之: 套接字广播收发+多线程