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

Introduction to Taobao promotion skills

Many people say that it is difficult for Taobao n...

Some Apple iPhone 13/12 iOS 15 devices damage car Bluetooth hands-free system

According to 9to5 Mac, more and more iPhone users...

Stop complaining about me being unsophisticated, it's because I'm so charming

Silicon, the chemical element with the second hig...

How much does it cost to be an agent for a fresh food mini app in Daqing?

How much does it cost to be an agent of Daqing’s ...

What? Cockroaches can also make oil? Cooking oil!

What? Cockroaches can also make oil? Cooking oil?...

Can air fryers produce carcinogens? How to use them healthily

In recent years, many families have bought air fr...

Apple's officially certified mobile phone cases are here, what do you think?

[[139342]] Apple has launched an activity page ca...