MFC 綁定地址 計(jì)算機(jī)內(nèi)的多種IP地址帶來的麻煩
轉(zhuǎn)載請聲明https://blog.csdn.net/m0_37147712/article/details/79906127
作者郵箱XiaXiangX@foxmail.com
在筆記本中有虛擬地址,藍(lán)牙地址鲜戒,代理地址,以太網(wǎng)地址等基矮。
這里寫圖片描述
在MFC獲取IP地址用來綁定套接字時可能會出現(xiàn)10049錯誤聚磺,使用WSAGetLastError()會顯示WSAEADDRNOTAVAI。這項(xiàng)錯誤的意思是遠(yuǎn)程連接失敗聂沙,原因是用戶獲取的IP地址不一定是以太網(wǎng)地址秆麸。
看上面的圖片可知,此電腦的ipv4地址在第5個及汉,如果我填第一個IP地址蛔屹,會出現(xiàn)如下現(xiàn)象。代碼豁生,和截圖如下所示
char szHostName[MAX_PATH+1] ;
gethostname(szHostName, MAX_PATH); //獲取主機(jī)名
hostent* phostent = gethostbyname(szHostName); //獲取主機(jī)內(nèi)容
if (phostent == NULL)
{
AfxMessageBox(_T("得到本機(jī)地址失斖枚尽!"));
}
char* szIP = inet_ntoa(*(in_addr*)&phostent->h_addr_list[0]); //獲取主機(jī)IP
綁定套接字失敗
如若我使用第五個地址甸箱,將h_addr_list[0]處的0改為5育叁,則綁定套接字成功,如下圖芍殖。
綁定成功
想必看到這里你們會想了解判斷該IP為以太網(wǎng)地址方法豪嗽,我再這里給出一個比較麻煩的方法,如果有好的方案可以在下面留言代碼如下所示
void CServerChatDlg::GetiIpAddr(int i,CString &m_szServerIP)
{
//獲取IP地址
char szHostName[MAX_PATH + 1];
gethostname(szHostName, MAX_PATH); //獲取主機(jī)名
hostent* phostent = gethostbyname(szHostName); //獲取主機(jī)內(nèi)容
if (phostent == NULL)
{
AfxMessageBox(_T("得到本機(jī)地址失斖憧ァ龟梦!"));
}
//for (int i = 0;i<10; i++)
//{
char* szIP = inet_ntoa(*(in_addr*)&phostent->h_addr_list[i]); //獲取主機(jī)IP
//}
m_szServerIP = szIP; //在編輯框中顯示IP
}
部分代碼
for ( i = 0; i < 10; i++)
{
if (bind(m_LocalSocket, (sockaddr*)&sockAddr, sizeof(sockAddr)) == 0)
{
m_BindAddr.EnableWindow(FALSE);
UpdateData(FALSE);
MessageBox("地址和端口綁定成功!", "提示");
break;
}
else
{
GetiIpAddr(i++,m_szServerIP);
sockAddr.sin_addr.S_un.S_addr = inet_addr(m_szServerIP.GetBuffer(0));
}
}
在這里我將查找IP地址專門拿出來做了一個函數(shù)窃躲,在判斷綁定成功時將每一個IP都試一下计贰。這樣就大功告成了,我沒有將所有代碼寫全蒂窒,如有問題躁倒,私聊或者評論都行。