2.3.2 具体编码(3)
(4) 定义函数OnReceive(),用于获得扫描结果。接收各个要查询机器发回来的响应信息,并从响应信息里取出对应机器的工作组、机器名、用户名和MAC地址。
具体代码如下:
- void CNBTSTATDlg::OnReceive()
- {
- BYTE Buf[500];
- CString str, strIP, strHost, strHex, strMac, Host, Group, User;
- UINT dport;
- m_UDPSocket.ReceiveFrom(Buf, 500, strIP, dport, 0); //接收数据
- //如果接收到的IP为空或者与原来接收到的IP相同,则返回
- if(strIP==(char)NULL || strIP==strOldIP) return;
- strOldIP = strIP;
- int index = m_ListView.InsertItem(0, strIP); //将IP插入ListView
- strHost = ""; //机器名字
- strHex = ""; //MAC地址
- User = " ";//
- Host = "\\";
- int tem=0, num=0;
- bool bAdd = true;
- //根据数据报规则取出相应的信息
- for(i=57; i<500; i++) //57-72
- {
- if(Buf[i]==0xcc) break;
- if(Buf[i]==0x20) bAdd = false;
- if(bAdd)
- {
- str.Format("%c", Buf[i]);
- if(Buf[i] >= ' ') strHost += str;
- str.Format("%02x.", Buf[i]);
- strHex += str;
- }
-
- if((++tem)%18 == 0)
- {
- bAdd = true;
- strHost.TrimRight((char)NULL);
- if(strHost == "")
- {
- strMac.Delete(17, strMac.GetLength()-17);
- m_ListView.SetItem(index, 4, LVIF_TEXT, strMac, 0, 0, 0, 0);
- break;
- }
- if(num==0 && strHost!="")
- {
- m_ListView.SetItem(index, 2, LVIF_TEXT, strHost, 0, 0, 0, 0);
- Host = strHost;
- num++;
- }
- else
- {
- if(Host!=strHost && num==1 && strHost!="")
- {
- m_ListView.SetItem(index,1,LVIF_TEXT,strHost, 0, 0, 0, 0);
- Group = strHost;
- num++;
- }
- else
- {
- if(strHost!=Host && strHost!=Group && num==2
- && strHost!="")
- {
- User = strHost;
- if(User != "__MSBROWSE__")
- {
- m_ListView.SetItem(index, 3, LVIF_TEXT,
- User, 0, 0, 0, 0);
- num++;
- }
- }
- }
- }
- strMac = strHex;
- strHost = "";
- strHex = "";
- }
- }
- //触发事件,导致线程函数的继续执行
- SetEvent(wait_handle);
- }
到此为止,整个项目中的核心模块已经介绍完毕,至于其他次要部分代码,请读者参考本书附带光盘中的源代码。执行之后的效果如图2-17所示。
|
| 图2-17 执行效果 |