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

时间:2021-06-10 13:39:09
小弟在分析一段程序的时候,遇到些问题,希望有高手能解答一下:
这是一个用线程,向网段内的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()函数中收到的数据中,是否有些特殊的位标记,那位高手懂的,跪求??

2 个解决方案

#1


不好意思忘了说了,定义 
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就是要发送的数据,这些字节可以定义与后面的接收到数据,有关系吗 ??

#2


学习   JF  帮顶

#1


不好意思忘了说了,定义 
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就是要发送的数据,这些字节可以定义与后面的接收到数据,有关系吗 ??

#2


学习   JF  帮顶