gpt4 book ai didi

c++ - Mac/iOS收不到UDP广播包,但可以发送UDP广播包

转载 作者:太空宇宙 更新时间:2023-11-04 13:40:14 26 4
gpt4 key购买 nike

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

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

每个测试设备只有一个网卡,连接到一个WIFI路由器。地址由 WIFI 路由器上的 DHCP 动态分配。套接字绑定(bind)到确切的本地地址而不是 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;
}

最佳答案

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

此外,当您绑定(bind)到 0.0.0.0 时它不起作用? – 老虫

关于c++ - Mac/iOS收不到UDP广播包,但可以发送UDP广播包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27979780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com