MFC 绑定地址 计算机内的多种IP地址带来的麻烦
转载请声明https://blog.csdn.net/m0_37147712/article/details/79906127
作者邮箱XiaXiangX@foxmail.com
在笔记本中有虚拟地址,蓝牙地址,代理地址,以太网地址等。
在MFC获取IP地址用来绑定套接字时可能会出现10049错误,使用WSAGetLastError()会显示WSAEADDRNOTAVAI。这项错误的意思是远程连接失败,原因是用户获取的IP地址不一定是以太网地址。
看上面的图片可知,此电脑的ipv4地址在第5个,如果我填第一个IP地址,会出现如下现象。代码,和截图如下所示
char szHostName[MAX_PATH+1] ;
gethostname(szHostName, MAX_PATH); //获取主机名
hostent* phostent = gethostbyname(szHostName); //获取主机内容
if (phostent == NULL)
{
AfxMessageBox(_T("得到本机地址失败!"));
}
char* szIP = inet_ntoa(*(in_addr*)&phostent->h_addr_list[0]); //获取主机IP
如若我使用第五个地址,将h_addr_list[0]处的0改为5,则绑定套接字成功,如下图。
想必看到这里你们会想了解判断该IP为以太网地址方法,我再这里给出一个比较麻烦的方法,如果有好的方案可以在下面留言代码如下所示
void CServerChatDlg::GetiIpAddr(int i,CString &m_szServerIP)
{
//获取IP地址
char szHostName[MAX_PATH + 1];
gethostname(szHostName, MAX_PATH); //获取主机名
hostent* phostent = gethostbyname(szHostName); //获取主机内容
if (phostent == NULL)
{
AfxMessageBox(_T("得到本机地址失败!"));
}
//for (int i = 0;i<10; i++)
//{
char* szIP = inet_ntoa(*(in_addr*)&phostent->h_addr_list[i]); //获取主机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地址专门拿出来做了一个函数,在判断绑定成功时将每一个IP都试一下。这样就大功告成了,我没有将所有代码写全,如有问题,私聊或者评论都行。
网友评论