Сокет GCDAsyncUdpSocket закрывается между отправкой 255 пакетов

У меня есть модуль, в котором я должен обнаружить, отправив пакеты на 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.

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

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

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

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

Спасибо


person niravdesai21    schedule 12.12.2018    source источник
comment
попробуйте уменьшить интервал до 254..‹256 ..... и сообщите результат.   -  person user3441734    schedule 12.12.2018
comment
Но мне нужен вывод от 1 до 255.   -  person niravdesai21    schedule 12.12.2018
comment
Вы знаете, что 192.188.2.255 широковещательный адрес? Широковещательный адрес — это сетевой адрес, по которому все устройства, подключенные к сети связи с множественным доступом, могут получать дейтаграммы. Сообщение, отправленное на широковещательный адрес, может быть получено всеми подключенными к сети хостами.   -  person user3441734    schedule 12.12.2018


Ответы (1)


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

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

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

person user3441734    schedule 13.12.2018
comment
Я обновил код, даже когда я делаю до 254, он случайно закрывается между ними. - person niravdesai21; 22.12.2018