8

解决 iOS 14.5 UDP 广播 sendto 返回 -1

 3 years ago
source link: https://mp.weixin.qq.com/s/2SmIYq6qCTFXHDL3j6LoeA
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

解决 iOS 14.5 UDP 广播 sendto 返回 -1

Original 展菲 网罗开发 1 week ago
收录于话题
#实战 36

1. 问题背景


  1. 手机系统升级到 iOS 14.5 之后,UDP 广播发送失败

  2. 项目中老版本使用到 socket 

  3. 项目中新版本使用 CocoaAsyncSocket

  4. 两种 UDP 发包方式都会报错 No route to host

报错具体内容如下:

sendto: -1client: sendto fail, but just ignore it: No route to host

2. 问题分析


2.1  sendto 返回 -1 问题排查

我们知道发送广播 sendto 返回 -1,正常情况sendto 返回值大于 0 。

首先判断 socket 连接是否建立

self._sck_fd4 = socket(AF_INET,SOCK_DGRAM,0);if (DEBUG_ON) {     NSLog(@"client init() _sck_fd4=%d",self._sck_fd4);}

self._sck_fd4 打印:

server init(): _sck_fd4=12

socket 连接正常,接下来判断数据发包

sendto(self._sck_fd4, bytes, dataLen, 0, (struct sockaddr*)&target_addr, addr_len) = -1

数据发送失败

2.2  增加 NSLocalNetworkUsageDescription 权限

  1. Info.plist 添加 NSLocalNetworkUsageDescription

  2. 发送一次UDP广播,触发权限弹框,让用户点击好,允许访问本地网络。

发现问题依旧存在

2.3 发送单播排查

由于项目中发送广播设置的 hostName 为 255.255.255.255,为了排查决定先发送单播看是否能成功。

将单播地址改为 192.168.0.101 之后发现是可以发送成功的,然后在新版本 CocoaAsyncSocket 库中发送单播也是可以成功的。

UDP 广播推荐使用 192.168.0.255 ,将广播地址改了之后,问题解决了,设备可以收到 UDP 广播数据。

3. 问题解决


由于 192.168.0.255 广播地址只是当前本地地址,App 中需要动态改变前三段 192.168.0 本地地址,解决方法如下:

NSString *localInetAddr4 = [ESP_NetUtil getLocalIPv4];NSArray *arr = [localInetAddr4 componentsSeparatedByString:@"."];NSString *deviceAddress4 = [NSString stringWithFormat:@"%@.%@.%@.255",arr[0], arr[1], arr[2]];

发包过滤,只需要过滤地址最后一段是否为 255

bool isBroadcast = [targetHostName hasSuffix:@"255"];
如何通过 ASWebAuthenticationSession 获取身份验证 code 码
iOS强化: 编译与链接
iOS强化 : 熟悉 Mach-O 文件iOS强化 : Xcode多环境配置CSS + HTML <文字效果>
CSS + HTML <网格布局 grid>CSS + HTML <文字排列效果>
Js <判断鼠标移入移出方向>Canvas <粒子文字效果>

领取面试题

640?wx_fmt=png

640?wx_fmt=jpeg

进入上方二维码内 回复「面试题」

如果觉得不错,素质三连、或者点个「赞」「在看」都是对笔者莫大的支持,谢谢各位大佬


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK