GCDAsyncUdpSocket 套接字在发送 255 个数据包之间关闭

Posted

技术标签:

【中文标题】GCDAsyncUdpSocket 套接字在发送 255 个数据包之间关闭【英文标题】:GCDAsyncUdpSocket Socket Closes In between sending 255 packets 【发布时间】:2018-12-12 12:46:59 【问题描述】:

我有一个模块,我必须通过向 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 "No route to host" UserInfo=NSLocalizedDescription=No route to host, NSLocalizedFailureReason=在 send() 函数中出错。

首先我为什么会收到这个错误,有没有其他方法可以实现这个结果。

编辑:

尝试运行此代码,我正在尝试从连接到同一路由器的设备获取响应。要查找设备 IP,我使用上面的代码。但是套接字有时会关闭,有时它会工作,有时它不会关闭。我无法找到关闭它的解决方案。

谢谢

【问题讨论】:

尝试将间隔减少到 254.. 但我需要的输出是从 1 到 255。 你知道192.188.2.255是广播地址吗?广播地址是连接到多路访问通信网络的所有设备都能够接收数据报的网络地址。发送到广播地址的消息可能会被所有网络连接的主机接收。 【参考方案1】:

广播消息被发送到网络或子网上的所有主机,并通过将 IP 地址的节点部分设置为全 1 来创建。

您收到的错误消息与广播消息不经过路由器这一事实有关。

为了能够广播数据报,底层套接字必须处于广播模式。在终端中运行 man setsockopt 以供进一步参考。

【讨论】:

我已经更新了代码,即使我更新到了 254,它也会在两者之间随机关闭。

以上是关于GCDAsyncUdpSocket 套接字在发送 255 个数据包之间关闭的主要内容,如果未能解决你的问题,请参考以下文章

GCDAsyncUdpSocket,“不能多次绑定套接字”

如何使用GCDAsyncUdpSocket连续发送udp数据包

GCDAsyncUdpSocket 和多播发送和接收

GCDAsyncUdpSocket 在发送到 IPv6 地址时立即关闭

为 GCDAsyncUdpSocket 设置最大数据包大小

GCDAsyncUdpSocket 不接收任何数据