gpt4 book ai didi

swift - 如何使用 Swift 获取我的 wifi 网络的广播地址?

转载 作者:行者123 更新时间:2023-11-30 11:49:46 26 4
gpt4 key购买 nike

目前我正在使用 GCDAsyncUdpSocket 发送 udp 广播。目前,代码将其发送到硬编码的 255.255.255.255 地址。这是所有网络上正确的广播地址吗?它会在某些网络上失败吗?正确的 swift 代码是什么?

socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.main)
socket!.send(ipRequestData!, toHost: "255.255.255.255", port: discoveryPort, withTimeout: 10000, tag: 0)

这个问题有答案,但它是在 Objective-C 中 Calculating the Broadcast Address in Objective-C

最佳答案

您的广播地址取决于您的主机地址和子网掩码。广播地址的计算公式可以在Wikipedia上找到。 :

broadcastAddress = ipAddress | ~subnetMask

您可以使用以下函数计算它:

func calculateBroadcastAddress(ipAddress: String, subnetMask: String) -> String {
let ipAdressArray = ipAddress.split(separator: ".")
let subnetMaskArray = subnetMask.split(separator: ".")
guard ipAdressArray.count == 4 && subnetMaskArray.count == 4 else {
return "255.255.255.255"
}
var broadcastAddressArray = [String]()
for i in 0..<4 {
let ipAddressByte = UInt8(ipAdressArray[i]) ?? 0
let subnetMaskbyte = UInt8(subnetMaskArray[i]) ?? 0
let broadcastAddressByte = ipAddressByte | ~subnetMaskbyte
broadcastAddressArray.append(String(broadcastAddressByte))
}
return broadcastAddressArray.joined(separator: ".")
}

示例:

let broadcastAddress = calculateBroadcastAddress(ipAddress: "172.16.0.0", subnetMask: "255.240.0.0")

结果:

"172.31.255.255"

一般来说,您永远不应该选择main队列进行网络操作,因为它会导致用户界面(在主队列中绘制)出现滞后。更好地利用

let udpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.global())

不要忘记显式启用此套接字的广播

do {
try udpSocket?.enableBroadcast(true)
} catch let error {
print(error)
}

另请注意,Apple 强制 iOS 应用程序使用 IPv6,该应用程序不支持广播,但 multicasts 。因此,如果您的设备位于纯 IPv6 网络内,也许您至少应该切换到多播。

关于swift - 如何使用 Swift 获取我的 wifi 网络的广播地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48461116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com