首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Swift中创建的CFSocket不监听

在Swift中创建的CFSocket不监听
EN

Stack Overflow用户
提问于 2015-11-09 22:42:15
回答 1查看 1.6K关注 0票数 0

我正在尝试使用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文件在吉斯特注册套接字的简写版本

代码语言:javascript
复制
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
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-10 18:22:46

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

代码语言:javascript
复制
sin.sin6_port = port.bigEndian
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33619715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档