Mac/iOS 无法接收 UDP 广播数据包,但可以发送 UDP 广播数据包
Mac/iOS cannot receive UDP broadcast packet, but can send UDP broadcast packet
我正在使用C/C++和socket开发跨平台游戏。我正在使用UDP广播(例如,如果在C型LAN地址上,则发送到xx.xx.xx.255)来发现LAN游戏中的附近玩家。
问题是Mac/iOS版本无法接收其他人发送的广播UDP数据包(既不是从Mac/iOS发送,也不是从Windows发送),而Windows版本能够接收来自Mac/iOS的广播数据包。因此,Mac/iOS无法发现任何附近的玩家,而窗口可以发现所有附近的玩家。在同一套接字句柄上,发送/接收正常的 UDP 数据包适用于所有平台(发送到特定地址而不是广播地址)。
每个测试设备只有一个 NIC,连接到单个 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;
}
您是否尝试将套接字绑定到广播地址(您要发送到的地址)? – 接骨木虫
此外,当您绑定到 0.0.0.0 时它不起作用? – 接骨木虫
相关文章:
- 发送固定大小的 UDP 数据包
- 使用C++将UDP数据包存储在Structure中
- 在高数据包速率下最大限度地减少丢弃的 UDP 数据包 (Windows 10)
- Qt 在可预测的秒数后跳过 UDP 数据包
- 高频接收UDP数据包:丢包?
- 为 posix recv 设置超时会导致 udp 数据包丢失吗?
- 了解 UDP 数据包大小限制的 TCP 数据包大小限制以及它在 boost::asio 编程级别的含义
- 获取进入UDP数据包的目标端口
- 操纵Windows Explorer窗口时,UDP数据包会掉落
- C++ 使用 recvmmsg 丢弃 UDP 数据包
- 如何在QT中接收适当的UDP数据包
- 使用ASIO捕获大量UDP数据包
- 如何正确接收多播UDP数据包
- 服务器未收到UDP数据包,花费数小时试图找出问题所在
- 当接收缓冲区几乎满时,阻止UDP数据包被部分截断
- 如何检查UDP数据包是否在发送器上发送
- 使用 QNX 实时操作系统实时接收 UDP 数据包
- 高效地发送UDP数据包流
- 为什么我在使用 winsock 时没有收到 UDP 数据包?
- SDL_net UDP 数据包数据