小弟在分析一段程序的时候,遇到些问题,希望有高手能解答一下:
这是一个用线程,向网段内的IP地址发送消息,来得到对应IP地址的主机的信息的程序,
首先是在程序调用一个线程,向指定的网段内循环发送数据,比如用CSocket派生出一个类CUDP类,调用CUDP::SendTo((void*)bs,50,destPORT,m_strIP,0)
这里bs是要发送的的数据,50代表要发送的字节数,destPORT端口用的是137就是nbtstat name port,m_strIP就是发送的目标IP地址,0位Flag位,2、接下来重载了CSocket的成员函数OnReceive,用于处理接受到对应于m_strIP的地址接收到的数据,下面是具体的代码段,有几处我看不明白,那位高手能指导一下:
void CUDP::OnReceive()
{BYTE Buf[500];
//m_UDPSocket.Receive(Buf,500,0);CString str,strIP,strHost,strHex,strMac,Host,Group,User;
UINT dport;
m_UDPSocket.ReceiveFrom(Buf,500,strIP,dport,0);if(strIP==(char)NULL||strIP==strOldIP)return;
strOldIP=strIP;int index=m_ListView.InsertItem(0,strIP);strHost="";
strHex="";
User="?";
Host="\\";int tem=0,num=0;
bool bAdd=true;        //从这里这些接收到的信息的处理,if语句中的0xcc这些是不时特殊的标记位呢?
//if(m_strIP==strIP)
for(i=57;i<500;i++) //57-72
{
if(Buf[i]==0xcc)break; //这里0xcc
if(Buf[i]==0x20)bAdd=false;//0x20两个数据有特殊的含义吗
if(bAdd)
{
str.Format("%c",Buf[i]);
if(Buf[i]>=' ')strHost+=str;str.Format("%02x.",Buf[i]);
strHex+=str;
}if((++tem)%18==0) //为什么有%18呢?
{
            bAdd=true; 
//m_ListBox.AddString(strHost);//
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;
//AfxMessageBox(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++;
}
//num++;
}
}}strMac=strHex;
strHost="";
strHex="";}}
SetEvent(wait_handle);
}
用Sendto()发送nbtstat的命令后
在接收在调用CUPD::RecieveForm()函数中收到的数据中,是否有些特殊的位标记,那位高手懂的,跪求??
不好意思忘了说了,定义 
BYTE bs[50]={0x1,0x00,0x0,0x10,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x20,0x43,0x4b,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x0,0x0,0x21,0x0,0x1};
bs就是要发送的数据,这些字节可以定义与后面的接收到数据,有关系吗 ??

解决方案 »

  1.   

    这个是
    用nbtstat获取网段内所有的主机的ip地址和MAC地址和主机名称存在的问题
      

  2.   

    这个让我分析就是两个情况,
    1, 目标机肯定有服务程序,回复数据的,这个RECEIVE函数里的处理就是处理这些回复数据的2、这些数据之所以这样处理是因为数据协议就是这样,你不明白就是因为你不明白协议是怎么样的,程序既然这样写就是说明他明白协议,知道哪位写个0XCC表示什么哪位写个0X20表示什么,没什么,就是协议而已。谁都可以定协议。3、BS[50]的内容就是向目标机发一个按协议制定的内容,目标机看到就知道处理什么。