GCDAsyncUdpSocket Socket закрывается между отправкой 255 пакетов - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть модуль, который я должен обнаружить, отправив пакеты на 255 IP-адресов.например.Подключенный IP: 192.188.2.1, затем я должен отправить пакет, изменяющий последнее значение, т.е.

var HOST = "192.188.2.1"
var arr = HOST.components(separatedBy: ".")
for i in 1 ..< 254
{
     dispatchGroup.enter()
     time += 0.005
     DispatchQueue.main.asyncAfter(deadline: .now() + time) {
        let obj = LPScanPacket()
         arr[3] = "\(i)"
         let str = arr.joined(separator: ".")
         SenderWrapper.sendLPPacket(lpPacket: obj, HOST: str)
         dispatchGroup.leave()
      }          
 }
 dispatchGroup.notify(queue: .main) {
      print("Completed sending ?")
 }

Но при отправке этого большого количества пакетов это показывает мне ошибку в методе делегата udpSocketDidClose

Ошибка домена = NSPOSIXErrorDomain Code = 65 «Нет маршрута к хосту» UserInfo = {NSLocalizedDescription = Нет маршрута к хосту, NSLocalizedFailureReason = Ошибка в функции send ().}

Во-первых, почему я получаю эту ошибку,Есть ли какой-нибудь альтернативный способ достижения этого результата.

РЕДАКТИРОВАТЬ:

Попробуйте запустить этот код, я пытаюсь получить ответ от устройства, подключенного к тому же маршрутизатору.Чтобы найти IP-адрес устройства, я использую приведенный выше код.Но сокет между ними закрывается, иногда он работает, а иногда нет. Я не могу найти решение, почему он закрывается.

Спасибо

1 Ответ

0 голосов
/ 13 декабря 2018

Широковещательное сообщение отправляется всем хостам в сети или подсети и создается путем установки для части узла IP-адреса всех единиц.

Полученное вами сообщение об ошибке связано с тем, чтошироковещательные сообщения не проходят через маршрутизаторы.

Чтобы иметь возможность транслировать дейтаграмму, базовый сокет должен находиться в режиме широковещания.Запустите man setsockopt в своем терминале для дальнейшего использования.

...