【发布时间】:2017-10-23 22:08:36
【问题描述】:
我发现CFStreamCreatePairWithSocketToCFHost 的文档令人困惑:
具体来说,我不清楚该函数如何在出错时将 readStream 指针设置为 null。 据我了解,指针是按值传递的——所以函数只能改变指针指向的对象。 现在我不知道如何检测连接错误。
相关文档sn-p:
创建连接到给定 CFHost 对象的可读和可写流。
void CFStreamCreatePairWithSocketToCFHost (
CFAllocatorRef alloc,
CFHostRef host,
SInt32 port,
CFReadStreamRef *readStream,
CFWriteStreamRef *writeStream
);
读取流
返回时,包含连接到端口端口上的主机主机的 CFReadStream 对象,如果在创建过程中失败,则为 NULL。如果传递 NULL,该函数将不会创建可读流。所有权遵循创建规则。
这是我的连接代码,它一直到 NSLog(@"Connected") 即使服务器关闭。
NSLog(@"Attempting to (re)connect to %@:%d", m_host, m_port);
while(TRUE)
{
CFHostRef host = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)m_host);
if (!host)
{
NSLog(@"Error resolving host %@", m_host);
[NSThread sleepForTimeInterval:5.0];
continue;
}
CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, host , m_port, &m_in, &m_out);
CFRelease(host);
if (!m_in)
{
NSLog(@"Error");
}
CFStreamClientContext context = {0, self,nil,nil,nil};
if (CFReadStreamSetClient(m_in, kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, networkReadEvent, &context))
{
CFReadStreamScheduleWithRunLoop(m_in, CFRunLoopGetCurrent(),kCFRunLoopCommonModes);
}
if (CFWriteStreamSetClient(m_out, kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, networkWriteEvent, &context))
{
CFWriteStreamScheduleWithRunLoop(m_out, CFRunLoopGetCurrent(),kCFRunLoopCommonModes);
}
BOOL success = CFReadStreamOpen(m_in);
CFErrorRef error = CFReadStreamCopyError(m_in);
if (!success || (error && CFErrorGetCode(error) != 0))
{
NSLog(@"Connect error %s : %d", CFErrorGetDomain(error), CFErrorGetCode(error));
[NSThread sleepForTimeInterval:5.0];
}
else
{
NSLog(@"Connected");
break;
}
}
【问题讨论】:
-
在调用函数之前,您是否明确将
m_in和m_out设置为NULL?这可能会解决您的问题。 -
其实我已经在做这个了。
标签: objective-c core-foundation