首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >纯Swift TCP连接

纯Swift TCP连接
EN

Stack Overflow用户
提问于 2016-06-28 19:16:24
回答 1查看 589关注 0票数 0

我正在尝试构建一个类,它可以使用纯Swift代码创建TCP连接。所有东西都编译文件,但是当下面的代码运行时,我在调用EXC_BAD_ACCESS函数时会遇到getaddrinfo崩溃。

当试图引用servInfo函数的最后一个参数中的getaddrinfo变量时,就会发生崩溃。我环顾了一下网络,我声明UnsafeMutablePointer变量的方式是正确的,因为它需要由getaddrinfo函数来设置。

有人知道怎么回事吗?我正在构建使用最新的Swift 3快照。

代码语言:javascript
运行
复制
import Darwin
import Foundation

class SwiftTcp {

    //MARK: - Properties

    var serviceAddress = "0.0.0.0"
    var servicePort: Int = 8080

    //MARK: - Read-only properties

    private(set) var status: Int32 = 0

    //MARK: - Private variables

    // protocol configuration
    private var hints = addrinfo(
        ai_flags: AI_PASSIVE,
        ai_family: AF_UNSPEC,
        ai_socktype: SOCK_STREAM,
        ai_protocol: 0,
        ai_addrlen: 0,
        ai_canonname: nil,
        ai_addr: nil,
        ai_next: nil)

    // used to set the protocol info needed to make a socket connection
    private var servInfo: UnsafeMutablePointer<addrinfo> = nil

    //MARK: - Initialization

    deinit {
        freeaddrinfo(servInfo)
    }

    init() {

        SwiftLog.trace("[SwiftTcp][Connect] Initialize...")

        // get protocol info
        status = getaddrinfo(
            nil,
            UnsafePointer<Int8>(bitPattern: servicePort),
            &hints,
            &servInfo)

        if (status != 0) {
            let err = String(UTF8String: gai_strerror(status)) ?? "Unknown error code"
            SwiftLog.error("Unable to get address information: Error \(err)")
            return
        }

        #if DEBUG

            var info = servInfo

            repeat {

                let (clientIp, service) = sockaddrDescription(info.memory.ai_addr)
                let message = "HostIp: " + (clientIp ?? "?") + " at port: " + (service ?? "?")
                SwiftLog.debug(message)

                // get next or nil
                info = nil
                info = info.memory.ai_next

            } while info != nil

        #endif
    }

    func connect() {
        // do nothing
    }

    //MARK: - Private Helpers

    private func sockaddrDescription(addr: UnsafePointer<sockaddr>) -> (String?, String?) {

        var host : String?
        var service : String?

        var hostBuffer = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0)
        var serviceBuffer = [CChar](count: Int(NI_MAXSERV), repeatedValue: 0)

        if getnameinfo(
            addr,
            socklen_t(addr.memory.sa_len),
            &hostBuffer,
            socklen_t(hostBuffer.count),
            &serviceBuffer,
            socklen_t(serviceBuffer.count),
            NI_NUMERICHOST | NI_NUMERICSERV)

            == 0 {

            host = String(UTF8String: hostBuffer)
            service = String(UTF8String: serviceBuffer)
        }
        return (host, service)

    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-28 19:32:38

第二个论点

代码语言:javascript
运行
复制
status = getaddrinfo(
        nil,
        UnsafePointer<Int8>(bitPattern: servicePort),
        &hints,
        &servInfo)

没有任何意义,并导致崩溃,因为您正在将数字8080转换为指针。

getaddrinfo()在这里需要一个C字符串( Swift中的UnsafePointer<Int8>),但是您可以简单地传递一个Swift字符串,它会自动转换(如 function parameter behavior中所解释的):

代码语言:javascript
运行
复制
let servicePort = "8080"
status = getaddrinfo(
        nil,
        servicePort,
        &hints,
        &servInfo)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38084542

复制
相关文章

相似问题

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