-2

UDPを使用するMFCのクライアントサーバーアプリケーションがあり、サーバーは接続されているクライアントのIPアドレスをリストボックスに表示します。クライアントとサーバーを同じコンピューターで実行すると、プログラムはMACアドレスを表示しますが、クライアントを別のコンピューターで実行しようとすると、プログラムがクラッシュします。これが3つの機能です。IPアドレスが選択されたときに2番目のリストボックスに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);                        
}
4

1 に答える 1

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がnullの場合に処理する必要があります。

MSDNのIP_ADAPTER_INFO構造体を参照してください。

于 2013-03-26T12:54:35.350 に答える