套接字 10049 WSAEADDRNOTAVAI

MFC 绑定地址 计算机内的多种IP地址带来的麻烦

转载请声明https://blog.csdn.net/m0_37147712/article/details/79906127
作者邮箱[email protected]


在笔记本中有虚拟地址,蓝牙地址,代理地址,以太网地址等。


这里写图片描述

在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都试一下。这样就大功告成了,我没有将所有代码写全,如有问题,私聊或者评论都行。

你可能感兴趣的:(套接字 10049 WSAEADDRNOTAVAI)