我遵循CFNetwork编程指南中的示例代码,特别是关于在使用时防止阻塞的部分。我的代码与他们的(下面)几乎相同,但是,当我连接到我的服务器时,我得到了posix错误14 (错误的地址-这个IP地址是坏的(除非它不是)吗?我打的电话的记忆地址不好吗?不然呢?!
我不知道如何调试这个。我对整个CFNetworking非常陌生,从一开始我从来就不是网络方面的专家(我最喜欢的一点是:轻松网络!:D)
无论如何,日志如下,下面是代码。任何提示都将不胜感激。
日志:
[6824:20b] [DEBUG] Compat version: 30000011
[6824:20b] [DEBUG] resovled host.
[6824:20b] [DEBUG] writestream opened.
[6824:20b] [DEBUG] readstream client assigned.
[6824:20b] [DEBUG] readstream opened.
[6824:20b] [DEBUG] *** Read stream reported kCFStreamEventErrorOccurred
[6824:20b] [DEBUG] *** POSIX error: 14 - Bad address
[6824:20b] Error closing readstream
[6824:20b] [DEBUG] Writing int: 0x09000000 (0x00000009)代码:
+ (BOOL) connectToServerNamed:(NSString*)name atPort:(int)port {
CFHostRef theHost = CFHostCreateWithName (NULL, (CFStringRef)name);
CFStreamError error;
if (CFHostStartInfoResolution (theHost, kCFHostReachability, &error))
{
NSLog (@"[DEBUG] resovled host.");
CFStreamCreatePairWithSocketToCFHost (NULL, theHost, port, &readStream, &writeStream);
if (CFWriteStreamOpen(writeStream))
{
NSLog (@"[DEBUG] writestream opened.");
CFStreamClientContext myContext = { 0, self, NULL, NULL, NULL };
CFOptionFlags registeredEvents = kCFStreamEventHasBytesAvailable |
kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered;
if (CFReadStreamSetClient (readStream, registeredEvents, readCallBack, &myContext))
{
NSLog (@"[DEBUG] readstream client assigned.");
CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(),
kCFRunLoopCommonModes);
if (CFReadStreamOpen(readStream))
{
NSLog (@"[DEBUG] readstream opened.");
CFRunLoopRun();
// Lots of error condition handling snipped.
[...]
return YES;
}
void readCallBack (CFReadStreamRef stream, CFStreamEventType event, void *myPtr)
{
switch (event)
{
case kCFStreamEventHasBytesAvailable:
{
CFIndex bytesRead = CFReadStreamRead(stream, buffer, kNetworkyBitsBufferSize); // won't block
if (bytesRead > 0) // <= 0 leads to additional events
{
if (listener)
{
UInt8 *tmpBuffer = malloc (sizeof (UInt8) * bytesRead);
memcpy (buffer, tmpBuffer, bytesRead);
NSLog(@"[DEBUG] reveived %d bytes", bytesRead);
[listener networkDataArrived:tmpBuffer count:bytesRead];
}
NSLog(@"[DEBUG] reveived %d bytes; no listener", bytesRead);
}
}
break;
case kCFStreamEventErrorOccurred:
NSLog(@"[DEBUG] *** Read stream reported kCFStreamEventErrorOccurred");
CFStreamError error = CFReadStreamGetError(stream);
logError(error);
[NetworkyBits shutDownRead];
break;
case kCFStreamEventEndEncountered:
NSLog(@"[DEBUG] *** Read stream reported kCFStreamEventEndEncountered");
[NetworkyBits shutDownRead];
break;
}
}
void logError (CFStreamError error)
{
if (error.domain == kCFStreamErrorDomainPOSIX) // Interpret error.error as a UNIX errno.
{
NSLog (@"[DEBUG] *** POSIX error: %d - %s", (int) error.error, strerror(error.error));
}
else if (error.domain == kCFStreamErrorDomainMacOSStatus)
{
NSLog (@"[DEBUG] *** MacOS error: %d", (int) error.error);
}
else
{
NSLog (@"[DEBUG] *** Stream error domain: %d, error: %d", (int) error.error);
}
}发布于 2008-11-28 06:42:10
奥利,你在哪里
buffer你提供给
CFReadStreamRead()来自?EFAULT是一个糟糕的缓冲地址..。你确定你真的已经初始化这个缓冲区来指向有效的东西吗?很明显是全球性的或者某个时候..。这本身就是个坏主意。您应该在您的函数中分配它,或者它应该是ivar (如果您使用的是Obj-C)。
发布于 2008-11-28 06:08:08
我不熟悉Cocoa或Objective,但我可以告诉您,POSIX错误代码14名为埃弗尔特,这意味着您使用无效的指针值进行了系统调用。这几乎可以肯定是一些用户提供的缓冲区指针,指向某种类型的读或写系统调用。检查所有的缓冲区指针,确保它们不是空的。检查malloc()的返回值--您可能无法分配缓冲区。
https://stackoverflow.com/questions/325122
复制相似问题