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;广播或者组播改为这种,就可以接收消息