目前我正在使用GCDAsyncUdpSocket发送udp广播。目前,代码将其发送到硬编码的255.255.255.255地址。这是所有网络上正确的广播地址吗?它会在某些网络上失败吗?什么是正确的快速代码?
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
答案 0 :(得分:0)
您的广播地址取决于您的主机地址和子网掩码。您可以在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网络中,至少可以切换到多播。