1

UDP接続を使用してC++でサーバーとクライアントプログラムを使用して別のコンピューターのMACアドレスを取得しようとしています。サーバーは1台のコンピューター上にあります(1つは接続されたクライアントのIPアドレス用、もう1つはMACアドレス用の2つのリストボックスが含まれています)クライアントは別のコンピューター上にあります。現在のコードは、サーバーとクライアント、および同じコンピューターを実行している場合にのみMACアドレスを取得します。プログラムをデバッグすると、別のコンピューターのMACアドレスを取得しようとすると、プログラムがifステートメントに含まれず、PrintMACaddress(pAdapterInfo-> Address);という行が実行されないことがわかります。

 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;// Contains pointer to current adapter info
    bool found = false;
    do {
        const IP_ADDR_STRING *addr_str = &pAdapterInfo->IpAddressList; 
        if (addr_str != NULL)
        {
            if (selected_ip_adr == addr_str->IpAddress.String)
            {
                PrintMACaddress(pAdapterInfo->Address);
            }              
        }   

        pAdapterInfo = pAdapterInfo->Next; 


    }
    while(pAdapterInfo);                        

}

ARP関数を使用するとこれが役立つ場合があります。または、MACアドレスがデータであるため、文字列または生データとして送信する場合がありますが、これを行う方法はわかります。

PrintMAC関数は次のとおりです。

    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); 
}
4

1 に答える 1

0

このGetAdaptersInfo関数は、ローカルコンピューターに接続されているアダプターのアドレスのみを返します。SendARPを確認する必要があります。

編集:これを試してください:

void CmfcServerDlg::PrintMACFromIP(const CString &selected_ip_adr)
{
DWORD dwRetVal;
IPAddr DestIp = 0;
IPAddr SrcIp = 0;       /* default for src ip */
ULONG MacAddr[2];       /* for 6-byte hardware addresses */
ULONG PhysAddrLen = 6;  /* default to length of six bytes */

char *SrcIpString = NULL;

BYTE *bPhysAddr;

DestIp = inet_addr(CT2A(selected_ip_adr));

memset(&MacAddr, 0xff, sizeof (MacAddr));

dwRetVal = SendARP(DestIp, SrcIp, &MacAddr, &PhysAddrLen);

if (dwRetVal == NO_ERROR) {
    bPhysAddr = (BYTE *) & MacAddr;
    if (PhysAddrLen) {
        CString theMac;
        theMac.Format(_T("%.2X-%.2X-%.2X-%.2X-%.2X-%.2X"), (int) bPhysAddr[0],
            (int) bPhysAddr[1],(int) bPhysAddr[2],(int) bPhysAddr[3],(int) bPhysAddr[4],
            (int) bPhysAddr[5]);
        PrintMACaddress(theMac);
    } else
        printf
            ("Warning: SendArp completed successfully, but returned length=0\n");

} else {
    printf("Error: SendArp failed with error: %d", dwRetVal);
    switch (dwRetVal) {
    case ERROR_GEN_FAILURE:
        printf(" (ERROR_GEN_FAILURE)\n");
        break;
    case ERROR_INVALID_PARAMETER:
        printf(" (ERROR_INVALID_PARAMETER)\n");
        break;
    case ERROR_INVALID_USER_BUFFER:
        printf(" (ERROR_INVALID_USER_BUFFER)\n");
        break;
    case ERROR_BAD_NET_NAME:
        printf(" (ERROR_GEN_FAILURE)\n");
        break;
    case ERROR_BUFFER_OVERFLOW:
        printf(" (ERROR_BUFFER_OVERFLOW)\n");
        break;
    case ERROR_NOT_FOUND:
        printf(" (ERROR_NOT_FOUND)\n");
        break;
    default:
        printf("\n");
        break;
    }
  }
}

void CmfcServerDlg::PrintMACaddress(CString& strText)
{
    m_ClientIdList.AddString(strText); 
}
于 2013-03-26T15:55:14.977 に答える