虚拟机中linux下udp收不到组播或广播消息?

windows下正常,然后切换到虚拟机中,在Linux下运行代码,发现组播和广播接收不到消息,点对点可以接收到消息。
将组播和广播绑定地址为任意IP这种情况,则可以接收到消息。
    因为涉及到多网卡,linux下不能指定某个IP地址进行bind接收吗?

    int nres = -1;
    QString strLocalIP = m_UdpInfo.m_cLocalIP;
    m_pRecvSockaddr_in = new sockaddr_in;

    m_pRecvSockaddr_in->sin_family = AF_INET;
    m_pRecvSockaddr_in->sin_port = htons(m_UdpInfo.m_usLocalPort);

    if(strLocalIP.isEmpty())
    {
        m_pRecvSockaddr_in->sin_addr.s_addr = INADDR_ANY;
    }
    else
    {
        nres = inet_pton(AF_INET,m_UdpInfo.m_cLocalIP,&m_pRecvSockaddr_in->sin_addr);//htonl(INADDR_ANY);    // 接收任意地址数据
        if (nres == 0 || errno == EAFNOSUPPORT)
        {
    #ifdef  _WIN32
            LogToolLib::addError(QString("接收套接字 inet_pton failed %1").arg(WSAGetLastError()));
            closesocket(pSocketFd);
    #elif linux
            LogToolLib::addError(QString("接收套接字 inet_pton failed %1").arg(strerror(errno)));
            close(pSocketFd);
    #elif unix // all unices not caught above
            LogToolLib::addError(QString("接收套接字 inet_pton failed %1").arg(strerror(errno)));
            close(pSocketFd);
    #else
    # error "Unknown"
    #endif
            return false;
        }
    }

//m_pRecvSockaddr_in->sin_addr.s_addr = INADDR_ANY;广播或者组播改为这种,就可以接收消息

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7423141
  • 除此之外, 这篇博客: 这是一个目录中的 UDP通信(服务器角色) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 介绍ESP8266中UDP服务器的建立和使用方法。