gpt4 book ai didi

objective-c - 提供回调函数作为特定的指针类型

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:38 26 4
gpt4 key购买 nike

我目前正在 Mac 上的 Objective-C 服务器上工作,该服务器在特定端口上监听传入数据。它已经适用于基于 NSStream 的双向未加密数据传输。

在下一步中,我想通过 SSL/TLS 保护连接。目前我正在遵循他们在 this 上的文档中描述的苹果方法。页。在概述中,他们描述了建立 SSL 连接的典型顺序。

我现在失败的地方是我必须给出表单的指针

typedef OSStatus (*SSLReadFunc) (
SSLConnectionRef connection,
void *data,
size_t *dataLength
);

在为 SSL 连接设置 I/O 函数的方法中,这样负责的对象可以调用这些方法来读取和写入我的流。我已经写了两个方法

// Called by the secure transport to write data on the stream
-(OSStatus)sslWriteCallbackFunction:(SSLContextRef)context data:(const void *)data dataLength:(size_t)dataLength sizeOfProcessedData:(size_t *)processed{
processed = (size_t *)[_writeStream write:data maxLength:dataLength];
if (processed < 0)
return errSSLProtocol;
else if (processed==0)
return 0;
else
return errSSLWouldBlock;
}

// Called by the secure transport to read data from the stream
-(OSStatus) sslReadCallbackFunction:(SSLContextRef)context data:(const void *)data dataLength:(size_t)dataLength{
uint8_t buffer[dataLength];
NSInteger err = [_readStream read:buffer maxLength:dataLength];

if (err < 0)
// Error
return errSSLProtocol;
else if (err==0)
// All bytes have been read
return 0;
else
// err corresponds to the number of bytes read, so there are still bytes available
dataLength = err;
return errSSLWouldBlock;
}

并希望在带有签名的方法中设置它们

OSStatus SSLSetIOFuncs (
SSLContextRef context,
SSLReadFunc readFunc,
SSLWriteFunc writeFunc
);

方法sslReadCallbackFunction分别通过readFunc和write方法传递。

现在,我如何创建指向上述表单的两个方法之一的指针。我已经尝试了很多,如果有人能帮助我或指出正确的方向,我将不胜感激。我用的是选择器,只是方法名前面的一个&,使用的是self的方法,....

感谢任何帮助,请注意我是 Objective-C 的新手 ;)

最佳答案

API 需要一个指向具有给定签名的 C 函数的指针,而不是 Objective-C 方法。如果您仍想处理方法中的回调,而不是函数中的回调,则需要使用“trampoline”函数。这是一个简单地调用 Objective-C 方法的小函数。回调函数通常包含一个用户上下文指针,您将其提供给 API 并传递给该函数。这很方便,因为您可以传入 self 并使用它轻松地向正确的 ObjC 实例发送消息。像这样:

OSStatus MySSLReadCallbackFunction(SSLConnectionRef connection, void *data, size_t *ioDataLength)
{
MySSLClass *obj = (__bridge MySSLClass *)connection
return [obj sslReadFromConnection:connection intoBuffer:data length:ioDataLength];
}

// In the function that sets this stuff up:
SSLSetConnection(context, (__bridge void *)self);
SSLSetIOFuncs(context, MySSLReadCallbackFunction, MySSLWriteCallbackFunction);

Mark Dalrymple 有一个 good post在他的博客上讨论这个普遍问题。

请注意,如该文章的评论中所述, 可以获得指向实现 ObjC 方法的底层 C 函数的指针。但是,实现 ObjC 方法的函数有两个“隐藏”参数(self_cmd),因此您不能强制它们对这样的 API 具有正确的签名.

关于objective-c - 提供回调函数作为特定的指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19521829/

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