iPhone SDK - NSStreamEventHasBytesAvailable / appendBytes: сбой - PullRequest
3 голосов
/ 10 апреля 2009

Отказ от ответственности: Я Xcode / iPhone SDK Noob.

Я пытаюсь установить соединение TCP / IP на стороне клиента с существующим сервером. После подключения я ожидаю получить некоторые данные о сервере (версия и т. Д.).

Когда мое соединение установлено, происходит событие NSStreamEventOpenCompleted, поэтому я знаю, что соединение установлено. Затем происходит событие NSStreamEventHasBytesAvailable, и я выполняю следующий код. Значение 71 (int) хранится в len, что я считаю правильным. Тем не менее, линия

[data appendBytes:&buffer length:len];

падает (я думаю). Фактической ошибки не выдается, но я вижу __TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__, хотя я явно добавил перехват ошибок:

case NSStreamEventHasBytesAvailable:
    {
        NSMutableData *data=[[NSMutableData alloc] init];

        uint8_t *buffer[1024];
        unsigned int len=0;

        len=[(NSInputStream *)stream  read:buffer maxLength:1024];
        if(len>0){  
            @try{
                [data appendBytes:&buffer length:len];
            }
            @catch(NSException *ex){
                NSLog(@"Fail: %@", ex); 
            }
            [statusLabel setText:[data stringValue]];
            //[bytesRead setIntValue:[bytesRead intValue]+len];
        }else{
            NSLog(@"No Buffer");
        }
        break ;
    }

Ответы [ 3 ]

10 голосов
/ 10 апреля 2009

Это проблема уровня C: вы запутались в буферах и указателях.

Этот код:

uint8_t *buffer[1024];

дает вам буфер стека из 1024 указателей на uint8_t с, что почти наверняка не то, что вы хотите. Вместо этого:

uint8_t buffer[1024];

Позже вы передаете адрес вашего указателя в стеке на - [NSMutableData appendBytes: length:], что опять-таки не то, что вы хотите: как в документации , передайте первый элемент:

[data appendBytes:buffer length:len];

Существует очень подробное руководство по программированию с полным кодом того, что вы пытаетесь сделать, вы можете сослаться на него.

Что касается __TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__, то повреждение памяти и неправильная разыменование указателя - это не то, что вы можете заметить с помощью Objective-C @try / @catch; это намного ниже уровня. С другой стороны, вы можете поймать это в отладчике, если включите отладку.

7 голосов
/ 10 апреля 2009

объявить ваш буфер как:

uint8_t buffer[1024];

и добавьте как:

[data appendBytes:buffer length:len];
2 голосов
/ 19 февраля 2011

Для полноты read:maxLength: возвращает NSInteger и будет отрицательным, если произошла ошибка. Присвоение его неподписанному int отменяет это и может привести к сбою.

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