1

我正在尝试实现到SecureTransport C 库的快速桥梁。我“认为”只要我知道如何在我的 sslReadCallback/sslWriteCallback 实现中从中读取内容,我就可以将任何东西作为连接传递。这是我正在使用的假设。当我查看 SSLConnectionRef 的定义时,似乎是这种情况:

/* Opaque reference to an I/O connection (socket, endpoint, etc.) */
public typealias SSLConnectionRef = UnsafePointer<Void>

所以我只需要把我的类变成 UnsafePointer。不幸的是,编译器不喜欢我的尝试。任何人都可以给我提示吗?

func startSSLProcess()
{
    self.sslContext = SSLCreateContext(kCFAllocatorDefault, SSLProtocolSide.ClientSide, SSLConnectionType.StreamType)
    if let sslContext = self.sslContext
    {
        SSLSetIOFuncs(sslContext, sslReadCallback, sslWriteCallback)
        SSLSetConnection(sslContext, UnsafePointer(self)) // <-- error
        SSLSetSessionOption(sslContext, SSLSessionOption.BreakOnClientAuth, true)
        SSLHandshake(sslContext)
    }
}

在 GCDAsyncSocket 中,它执行以下操作:

status = SSLSetConnection(sslContext, (__bridge SSLConnectionRef)self);

SubZeroGCDAsyncSocket *asyncSocket = (__bridge SubZeroGCDAsyncSocket *)connection;

..解开。这相当于什么?

非常感谢!

4

1 回答 1

0

答案在这里:

如何快速将自己转换为 UnsafeMutablePointer<Void> 类型

所以现在我执行以下操作:

func startSSLProcess()
{
    self.sslContext = SSLCreateContext(kCFAllocatorDefault, SSLProtocolSide.ClientSide, SSLConnectionType.StreamType)
    if let sslContext = self.sslContext
    {
        SSLSetIOFuncs(sslContext, sslReadCallback, sslWriteCallback)
        SSLSetConnection(sslContext, UnsafePointer(Unmanaged.passUnretained(self).toOpaque()))
        SSLSetSessionOption(sslContext, SSLSessionOption.BreakOnClientAuth, true)
        SSLHandshake(sslContext)
    }
}

我像这样展开:

    let transportWrapper:SecureTransportWrapper = Unmanaged<SecureTransportWrapper>.fromOpaque(COpaquePointer(connection)).takeUnretainedValue()

用您自己的类型替换 SecureTransportWrapper。

于 2016-05-30T18:37:07.343 回答