当我尝试查找MAC地址时程序崩溃

时间:2013-03-26 12:00:19

标签: mfc udp client-server ip-address mac-address

我在MFC中使用UDP有一个客户端服务器应用程序,其中服务器在列表框中显示已连接客户端的IP地址。如果我在同一台计算机上运行客户端和服务器,程序将显示MAC地址,但如果我尝试在另一台计算机上运行客户端程序崩溃。这是3个功能。我有一个列表框的事件处理程序,当选择IP地址时,它会在第二个列表框中显示MAC地址。 PrintMACFromIP是获取MAC地址的代码

void CmfcServerDlg::OnLbnSelchangeListClientaddr()
{
    BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
    int nIndex = m_ClientAddrList.GetCurSel();
    if(nIndex < 0)
        return;

    CString s1;
    m_ClientAddrList.GetText(nIndex, s1);
    PrintMACFromIP(s1);

}

void CmfcServerDlg::PrintMACaddress(unsigned char MACData[])
{
    CString strText;
    strText.Format("%02X-%02X-%02X-%02X-%02X-%02X\n",MACData[0], MACData[1], MACData[2], MACData[3], MACData[4], MACData[5]);
    m_ClientIdList.AddString(strText); 
}


void CmfcServerDlg:: PrintMACFromIP(const CString &selected_ip_adr)
{
    IP_ADAPTER_INFO AdapterInfo[16];            
    DWORD dwBufLen = sizeof(AdapterInfo);       

    DWORD dwStatus = GetAdaptersInfo(           
        AdapterInfo,                            
        &dwBufLen);                         
    assert(dwStatus == ERROR_SUCCESS);      

    PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;
    bool found = false;
    do {
        const IP_ADDR_STRING *addr_str = &pAdapterInfo->IpAddressList;
        while(addr_str != NULL)
        {

          if(selected_ip_adr == addr_str->IpAddress.String) 
          { 
            found = true;
            break;
          }
        }
        if(found)
        {
          PrintMACaddress(pAdapterInfo->Address);
          break;
        }
        else
        {
            pAdapterInfo = pAdapterInfo->Next;      
        }
    }
    while(pAdapterInfo);                        
}

1 个答案:

答案 0 :(得分:0)

我相信你的错误就在这里:

while(addr_str != NULL)
{
   if(selected_ip_adr == addr_str->IpAddress.String) 
   { 
      found = true;
      break;
   }
}

while更改为if (addr_str != NULL)

然后

应该看起来像

if (add_str != NULL)
{
   if (selected_ip_adr == addr_str->IpAddress.String)
   {
      PrintMACaddress(pAdapterInfo->Address);
   }              
}   

pAdapterInfo = pAdapterInfo->Next; 

如果在随后的next次调用中使用do / while,则pAdapterInfo为空,这应该处理。

请参阅MSDN上的IP_ADAPTER_INFO structure