我在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);
}
答案 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。