我正在尝试使用2012年WWDC会议的示例代码启动和运行基本的Bonjour发现,但已经将其转换为Swift。它部分起作用了。我可以注册一个港口,并在那个港口注册我的服务。客户端能够发现并解析该服务。
问题是:我调用CFSocketCreateWithNative()并指定回调侦听器,但是这个回调永远不会被调用。此外,我尝试连接wiht (telnet localhost 12345)并得到:
尝试:1. telnet:连接到地址::1:连接被拒绝 尝试127.0.0.1..。 telnet: Connection to address 127.0.0.1:连接被拒绝 试着80:1. telnet: connect地址fe80:1:连接被拒绝 telnet:无法连接到远程主机
这是我如何用完整的Swift文件在吉斯特注册套接字的简写版本
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
}为什么我的应用程序不监听它报告的端口呢?
发布于 2015-11-10 18:22:46
您的IPv4套接字正在侦听端口sin.sin_port.bigEndian,但是您的IPv6套接字正在侦听小端端口。更新IPv6代码以使用大端端口:
sin.sin6_port = port.bigEndianhttps://stackoverflow.com/questions/33619715
复制相似问题