Ошибка Posix 14 (неправильный адрес) в открытом потоке чтения в Какао. Советы? - PullRequest
1 голос
/ 28 ноября 2008

Я следую примеру кода в Руководстве по программированию CFNetwork , в частности, в разделе Предотвращение блокировки при работе с потоками . мой код почти идентичен их коду (ниже), но когда я подключаюсь к своему серверу, я получаю ошибку posix 14 (неверный адрес - это плохой IP-адрес (за исключением того, что это не так)? неверный адрес памяти для какого-либо звонка, который я сделал), или что?!.

Понятия не имею, как отладить это. Я действительно довольно новичок во всем, что касается сети CFNetworking, и никогда прежде не был особенно опытным специалистом по сетям (единственное, что мне действительно нравилось в Java: простые сети!: 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);
    }
}

Ответы [ 2 ]

2 голосов
/ 28 ноября 2008

Оли, при чем тут

buffer

что вы поставляете на

CFReadStreamRead()

откуда? EFAULT - неправильный адрес буфера ... вы уверены, что на самом деле инициализировали этот буфер, чтобы он указывал на что-то допустимое? Это очевидно глобально или когда-то ... что само по себе довольно плохая идея. Вы должны выделить его в своей функции, или это должен быть ивар (если вы используете Obj-C).

0 голосов
/ 28 ноября 2008

Я не знаком с Cocoa или Objective-C, но могу сказать, что код ошибки POSIX 14 называется EFAULT , и это означает, что вы сделали системный вызов с недопустимым значением указателя. Это почти наверняка некоторый предоставленный пользователем буферный указатель на какой-либо системный вызов чтения или записи. Проверьте все указатели буфера и убедитесь, что они не равны NULL. Проверьте возвращаемое значение из malloc() - возможно, вам не удалось выделить буфер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...