Solution to iOS 14.5 UDP broadcast Sendto returns -1

Solution to iOS 14.5 UDP broadcast Sendto returns -1

[[400268]]

This article is reprinted from the WeChat public account "Wangluo Development", written by Zhan Fei. Please contact the WeChat public account "Wangluo Development" to reprint this article.

1. Problem Background

  1. After the mobile phone system is upgraded to iOS 14.5, UDP broadcast sending fails
  2. The old version of the project uses socket
  3. The new version of the project uses CocoaAsyncSocket
  4. Both UDP packet sending methods will report an error No route to host

The specific contents of the error are as follows:

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

2. Problem Analysis

2.1 Troubleshooting sendto returns -1

We know that sending a broadcast sendto returns -1, and normally the sendto return value is greater than 0.

First determine whether the socket connection is established

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

self._sck_fd4 prints:

  1. server init(): _sck_fd4=12

The socket connection is normal, and then determine the data packet

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

Data sending failed

2.2 Add NSLocalNetworkUsageDescription permission

  1. Info.plist Add NSLocalNetworkUsageDescription
  2. Send a UDP broadcast to trigger a permission pop-up window, allowing the user to click OK to allow access to the local network.

Found that the problem still exists

2.3 Troubleshooting unicast messages

Since the hostName set for sending broadcast in the project is 255.255.255.255, in order to troubleshoot, we decided to send unicast first to see if it can succeed.

After changing the unicast address to 192.168.0.101, it was found that it could be sent successfully. Then, sending unicast in the new version of CocoaAsyncSocket library was also successful.

It is recommended to use 192.168.0.255 for UDP broadcast. After changing the broadcast address, the problem is solved and the device can receive UDP broadcast data.

3. Problem Solving

Since the 192.168.0.255 broadcast address is only the current local address, the first three segments of the 192.168.0 local address need to be changed dynamically in the App. The solution is as follows:

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

For packet filtering, you only need to filter whether the last segment of the address is 255.

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

<<:  Hongmeng OS, Android, IOS, which one is the future?

>>:  Android 12 is officially released: the biggest design change in Android history, smoother!

Recommend

Divergence or coexistence? A detailed explanation of Android kernel security

1. Knowledge Background In October 2003, Andy Rub...

Five key points of the new media operation matrix!

The concept of "private domain traffic"...

A strange abbreviation has appeared! Is "TMD" actually a disease?

Review expert: Lu Binshen, Department of Oral and...

Eight "traps" to avoid in the programmer profession

[[229123]] Let's face it. Some of you got int...

How to effectively deliver short video information flow?

This article mainly introduces the preparations b...

What are the benefits of adding Baidu framework users to the public?

Friends who have opened an account know that Baid...

Introduction to Xiaomi MiMeng advertising resources

Introduction to Mimeng Advertising Resources MiMe...

Thinking Upgrade-How to Upgrade Thinking Model to Pursue Compound Interest Life

Thinking Upgrade - How to Upgrade Thinking Models...

Analysis of Xiaohongshu promotion cases

As a marketer of Xiaohongshu, why should I talk a...

E-commerce operations: coupon product analysis

On e-commerce platforms, issuing coupons is a ver...

11 fragments of observations and thoughts about B station

Bilibili has been around for 11 years. As a senio...