gpt4 book ai didi

swift - 在 Swift 中创建的 CFSocket 不监听

转载 作者:行者123 更新时间:2023-11-30 10:09:45 25 4
gpt4 key购买 nike

我正在尝试使用 a 2012 WWDC session 中的示例代码启动并运行基本的 Bonjour 发现。 ,但已将其转换为 Swift。它正在部分工作。我可以注册一个端口,并在该端口上注册我的服务。客户端能够发现该服务并解决它。

问题是:我调用 CFSocketCreateWithNative() 并指定回调监听器,但该回调永远不会被调用。此外,我尝试使用 telnet 连接(telnet localhost 12345),我得到:

Trying ::1...

telnet: connect to address ::1: Connection refused

Trying 127.0.0.1...

telnet: connect to address 127.0.0.1: Connection refused

Trying fe80::1...

telnet: connect to address fe80::1: Connection refused

telnet: Unable to connect to remote host

这是我注册套接字的方式的缩写版本,包含完整的 Swift 文件 in a Gist :

private func registerIPv4Socket() throws -> (Int32, in_port_t) {
let fd4 = socket(AF_INET, SOCK_STREAM, 0)

var sin = sockaddr_in()
sin.sin_family = sa_family_t(AF_INET)
sin.sin_len = UInt8(sizeofValue(sin))
sin.sin_port = 0

withUnsafePointer(&sin) {
Foundation.bind(fd4, UnsafePointer($0), UInt32(sin.sin_len))
}

var addrLen = socklen_t(sizeofValue(sin))
withUnsafeMutablePointers(&sin, &addrLen) { (sinPtr, addrPtr) -> Int32 in
getsockname(fd4, UnsafeMutablePointer(sinPtr), UnsafeMutablePointer(addrPtr))
}

let listenError = listen(fd4, 5)
return (fd4, sin.sin_port)
}

private func registerIPv6Socket(port: in_port_t) throws -> Int32 {
let fd6 = socket(AF_INET6, SOCK_STREAM, 0)

var one: Int32 = 1
withUnsafePointer(&one) {
setsockopt(fd6, IPPROTO_IPV6, IPV6_V6ONLY, UnsafePointer($0), socklen_t(sizeofValue(one)))
}

var sin6 = sockaddr_in6()
sin6.sin6_family = sa_family_t(AF_INET6)
sin6.sin6_len = UInt8(sizeofValue(sin6))
sin6.sin6_port = port

withUnsafePointer(&sin6) {
Foundation.bind(fd6, UnsafePointer($0), UInt32(sin6.sin6_len))
}

var addrLen = socklen_t(sizeofValue(sin6))
withUnsafeMutablePointers(&sin6, &addrLen) { (sinPtr, addrPtr) -> Int32 in
getsockname(fd6, UnsafeMutablePointer(sinPtr), UnsafeMutablePointer(addrPtr))
}

listen(fd6, 5)
return fd6
}

为什么我的应用程序没有监听它报告的端口?

最佳答案

您的 IPv4 套接字正在监听端口 sin.sin_port.bigEndian,但您的 IPv6 套接字正在监听小端端口。更新您的 IPv6 代码以使用大端端口:

sin.sin6_port = port.bigEndian

关于swift - 在 Swift 中创建的 CFSocket 不监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33619715/

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