本文转载自微信公众号《网络开发》,作者展飞。转载本文请联系网路发展公众号。一、问题背景手机系统升级到iOS14.5后,老版本UDP广播发送失败。新版本的socket项目使用了CocoaAsyncSocket。两种UDP发送方式都会报错Noroutetohost。具体内容如下:sendto:-1client:sendtofail,butjustignoreit:Noroutetohost2.问题分析2.1sendto返回-1故障排除我们知道发送广播sendto返回-1,一般情况下sendto的返回值都大于0。首先判断socket连接是否建立self._sck_fd4=socket(AF_INET,SOCK_DGRAM,0);if(DEBUG_ON){NSLog(@"clientinit()_sck_fd4=%d",self._sck_fd4);}self._sck_fd4打印:serverinit():_sck_fd4=12socket连接正常,然后判断数据发送sendto(self._sck_fd4,bytes,dataLen,0,(structsockaddr*)&target_addr,addr_len)=-1数据发送失败UDP广播,触发权限pop-up框,让用户单击“确定”以允许访问本地网络。发现问题依旧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_NetUtilgetLocalIPv4];NSArray*arr=[localInetAddr4componentsSeparatedByString:@"."];NSString*deviceAddress4=[NSStringstringWithFormat:@"%@.%@.%@.255",arr[0],arr[1],arr[2]];发送包过滤,只需要过滤最后一段地址是不是255boolisBroadcast=[targetHostNamehasSuffix:@"255"];
