【问题标题】:program crashes when i try find MAC address当我尝试查找 MAC 地址时程序崩溃
【发布时间】:2013-03-26 12:00:18
【问题描述】:

我在 MFC 中有一个使用 UDP 的客户端服务器应用程序,服务器在列表框中显示已连接客户端的 IP 地址。如果我在同一台计算机上运行客户端和服务器,程序会显示 MAC 地址,但如果我尝试在另一台计算机上运行客户端,程序会崩溃。这是3个功能。 I have an event handler for the listbox that displays the MAC address in a second listbox when an IP address is selected. 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);                        
}

【问题讨论】:

  • 您是否尝试过放置调试语句或通过 IDE 跟踪它?这很可能是由于使用了空指针,但您没有提供足够的信息,例如转储核心或堆栈跟踪。您还应该在使用之前检查 pAdapterInfo 是否为 NULL。
  • 我调试了它,发现它卡在了while循环中。那么代码有问题吗?
  • while 循环在哪里?
  • 当它到达 if(selected_ip_adr == addr_str->IpAddress.String) so found 永远不会设置为 true 时会跳出 while 循环
  • 这很正常,如果 (selected_ip_adr == addr_str->IpAddress.String) 如果为 false 那么你将永远循环,因为 addr_str 永远不会改变。

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


【解决方案1】:

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

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; 

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

请参阅 MSDN 上的 IP_ADAPTER_INFO structure

【讨论】:

  • 好的,所以我运行了该代码,但它遇到了中断。为什么找不到 MAC 地址?
  • 感谢代码,但问题仍然存在。它到达 if 语句并跳出并执行 else。为什么不执行 if 语句?
  • @LisaCollins:如果? while 循环运行了多少次?
  • if (selected_ip_adr == addr_str->IpAddress.String)。你说删除while循环
  • 但它仍然跳过 if 语句 - if (selected_ip_adr == addr_str->IpAddress.String)。为什么程序不执行 if 语句并执行 PrintMACaddress(pAdapterInfo->Address); ?是不是还没有找到MAC地址?
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 2020-02-07
相关资源
最近更新 更多