Mac/iOS无法接收UDP广播包,但可以发送UDP广播包

问题描述 投票:0回答:2

我正在使用 C/C++ 和套接字开发一个跨平台游戏。我使用 UDP 广播(例如,如果在 C 型 LAN 地址上,则发送到 xx.xx.xx.255)来发现 LAN 游戏中附近的玩家。

问题是Mac/iOS版本无法接收其他人(无论是Mac/iOS还是Windows)发送的广播UDP数据包,而Windows版本可以接收来自Mac/iOS的广播数据包。因此,Mac/iOS 无法发现任何附近的玩家,而 Windows 可以发现附近的所有玩家。在同一个套接字句柄上,发送/接收普通 UDP 数据包适用于所有平台(发送到特定地址而不是广播地址)。

每台测试设备只有一个网卡,连接单个WIFI路由器。地址由 WIFI 路由器上的 DHCP 动态分配。套接字绑定到确切的本地地址而不是 0.0.0.0,并且我使用端口 19190。 [ 感谢您阅读我的问题:) ]

以下是在所有平台上初始化套接字的代码。我确实在 Mac/iOS 上设置了 SO_BROADCAST 标志,否则 UDP 广播数据包将无法成功发送。

BOOL Socket::__Create(const struct sockaddr &BindTo, int addr_len, int nSocketType, BOOL reuse_addr, int AF)
    {
        ASSERT(m_hSocket == INVALID_SOCKET);
        m_hSocket = socket(AF, nSocketType, 0);

        if(INVALID_SOCKET != m_hSocket)
        {
            int on = 1;
            if(SOCK_STREAM == nSocketType)
            {   linger l = {1,0};
                VERIFY(0==::setsockopt(m_hSocket,SOL_SOCKET,SO_LINGER,(char*)&l,sizeof(linger)));
    #if defined(PLATFORM_MAC) || defined(PLATFORM_IOS)
                VERIFY(0==::setsockopt(m_hSocket,SOL_SOCKET,SO_NOSIGPIPE,(void *)&on, sizeof(on)));
    #endif
            }
    #if defined(PLATFORM_MAC) || defined(PLATFORM_IOS)
            else if(SOCK_DGRAM == nSocketType)
            {
                VERIFY(0==::setsockopt(m_hSocket,SOL_SOCKET,SO_BROADCAST,(void *)&on, sizeof(on)));
            }
    #endif
            if(reuse_addr)
            {   VERIFY(0==setsockopt(m_hSocket,SOL_SOCKET,SO_REUSEADDR,(char*)&on,sizeof(on)));
            }

            if(0==bind(m_hSocket,&BindTo,addr_len))
            {
                return TRUE;
            }
        }

        _LOG_WARNING("Socket Error = "<<GetLastError());
        Close();
        return FALSE;
    }

这是接收代码:

BOOL Socket::__RecvFrom(LPVOID pData, UINT len, UINT& len_out, struct sockaddr &target, int addr_len, BOOL Peek)
{
    SOCKET_SIZE_T la = addr_len;
    int l = (int)recvfrom(m_hSocket,(char*)pData,len,Peek?MSG_PEEK:0,&target,&la);
    if(l==SOCKET_ERROR)return FALSE;
    len_out = l;
    return la == addr_len;
}
c++ ios macos sockets udp
2个回答
0
投票

您是否尝试将套接字绑定到广播地址(您要发送到的地址)? – 老虫

另外,当你绑定到 0.0.0.0 时它不起作用? – 老虫


0
投票

我遇到这个问题是因为我遇到了同样的问题。我正在向 255.255.255.255 发送广播,并将接收套接字绑定到 0.0.0.0。我在发送和接收套接字上设置 SO_BROADCAST (只是为了验证 - 在任何非 Mac 架构上的接收套接字上都不需要)。

我可以从任何(包括 Mac)发送到任何(Mac 除外)。 Mac到其他播放作品,任意其他到任意其他作品,但是任意到Mac收不到数据包。

© www.soinside.com 2019 - 2024. All rights reserved.