首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cocoa中打开读取流的Posix错误14 (错误地址)。暗示?

Cocoa中打开读取流的Posix错误14 (错误地址)。暗示?
EN

Stack Overflow用户
提问于 2008-11-28 05:55:56
回答 2查看 4.8K关注 0票数 1

我遵循CFNetwork编程指南中的示例代码,特别是关于在使用时防止阻塞的部分。我的代码与他们的(下面)几乎相同,但是,当我连接到我的服务器时,我得到了posix错误14 (错误的地址-这个IP地址是坏的(除非它不是)吗?我打的电话的记忆地址不好吗?不然呢?!

我不知道如何调试这个。我对整个CFNetworking非常陌生,从一开始我从来就不是网络方面的专家(我最喜欢的一点是:轻松网络!:D)

无论如何,日志如下,下面是代码。任何提示都将不胜感激。

日志:

代码语言:javascript
复制
[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)

代码:

代码语言:javascript
复制
+ (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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-11-28 06:42:10

奥利,你在哪里

代码语言:javascript
复制
buffer

你提供给

代码语言:javascript
复制
CFReadStreamRead()

来自?EFAULT是一个糟糕的缓冲地址..。你确定你真的已经初始化这个缓冲区来指向有效的东西吗?很明显是全球性的或者某个时候..。这本身就是个坏主意。您应该在您的函数中分配它,或者它应该是ivar (如果您使用的是Obj-C)。

票数 2
EN

Stack Overflow用户

发布于 2008-11-28 06:08:08

我不熟悉Cocoa或Objective,但我可以告诉您,POSIX错误代码14名为埃弗尔特,这意味着您使用无效的指针值进行了系统调用。这几乎可以肯定是一些用户提供的缓冲区指针,指向某种类型的读或写系统调用。检查所有的缓冲区指针,确保它们不是空的。检查malloc()的返回值--您可能无法分配缓冲区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/325122

复制
相关文章

相似问题

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