首页 > 解决方案 > setsockopt 在 MAC 上返回 SOCKET_ERROR

问题描述

以下是有关我的开发环境的信息:
Windows:
操作系统:Windows 10
Qt:5.15.2
编译器:MSVC2019

MAC:
操作系统:macOS Catalina (v 10.15.7)
Qt:5.15.2
编译器:clang 64 位

在我的应用程序中,我将一些多播数据包发送到在不同 PC 上运行的同一应用程序的其他实例。以下是代码片段:

        QUdpSocket myMulticastSocket;
        // PC_PORT_TO_RECEIVE is the port number used for all application client multicast communication
#ifdef Q_OS_MAC
        myMulticastSocket.bind(PC_PORT_TO_RECEIVE, QUdpSocket::ReuseAddressHint);
#else
        myMulticastSocket.bind(QHostAddress::AnyIPv4, PC_PORT_TO_RECEIVE, QUdpSocket::ReuseAddressHint);
#endif
        QHostAddress tHostAddr = lstValidIface.at(i);  // lstValidIface is a list of valid network interfaces available.

        // don't take any action for local host
        if ((tHostAddr == QHostAddress::LocalHost) ||
            (tHostAddr == QHostAddress::LocalHostIPv6) ||
            (tHostAddr == QHostAddress::AnyIPv6) ||
            (tHostAddr == QHostAddress::Any))
            continue;

        DWORD tIPAddr = htonl(tHostAddr.toIPv4Address());
        int sktDesptr = myMulticastSocket.socketDescriptor();

        int iErrCode = setsockopt(sktDesptr, 
                                IPPROTO_IP, 
                                IP_MULTICAST_IF, 
                                (char*)&tIPAddr, 
                                sizeof(tIPAddr));

上面的代码在 Windows 环境下运行良好。但在 MAC 中,对 setsockopt 的调用返回 SOCKET_ERROR (-1)。我无法弄清楚哪里出了问题。

请让我知道上述代码中是否有任何问题,或者需要做任何额外的工作才能使此代码在 MAC 上工作。
提前致谢。

标签: macosqtsocketswinsock

解决方案


将 Mac 套接字的绑定方法调用替换为上面提到的 Windows 套接字,帮助我解决了这个问题。


推荐阅读