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

时间:2018-01-26 12:09:45

标签: swift udp multicast

目前我正在使用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

1 个答案:

答案 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网络中,至少可以切换到多播。