服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - 解决 iOS 14.5 UDP 广播 Sendto 返回 -1

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

2021-05-18 23:27网罗开发展菲 IOS

手机系统升级到 iOS 14.5 之后,UDP 广播发送失败,我们知道发送广播 sendto 返回 -1,正常情况sendto 返回值大于 0 。

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

1. 问题背景

 

  1. 手机系统升级到 iOS 14.5 之后,UDP 广播发送失败
  2. 项目中老版本使用到 socket
  3. 项目中新版本使用 CocoaAsyncSocket
  4. 两种 UDP 发包方式都会报错 No route to host

报错具体内容如下:

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

2. 问题分析

 

2.1 sendto 返回 -1 问题排查

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

首先判断 socket 连接是否建立

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

self._sck_fd4 打印:

  1. server init(): _sck_fd4=12 

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

  1. 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 本地地址,解决方法如下:

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

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

  1. bool isBroadcast = [targetHostName hasSuffix:@"255"]; 

原文链接:https://mp.weixin.qq.com/s/2SmIYq6qCTFXHDL3j6LoeA

延伸 · 阅读

精彩推荐
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01