NSInputStream getBuffer: length: не работает? - PullRequest
3 голосов
/ 29 октября 2010

Я действительно хотел бы использовать getBuffer:length: метод NSInputStream. После долгих исследований я не смог найти действительный пример, который использует этот метод, потому что большинству людей действительно нужно read: maxLength:.

Итак, теперь некоторые факты об окрестностях: * Я разрабатываю приложение для iPhone, iOS 3.1.3 * Я установил сетевое соединение через сокеты * Это сетевое соединение действительно работает; так что я не забыл добавить поток в runloop или действительный делегат или что-то в этом роде - это уже работает * Я только отправляю и получаю Строки по сети. * Я установил действительный делегат, который правильно реализует stream: handleEvent: (различает полученные события и выполняет надлежащие действия). Я не уверен, правильно ли принят код на 100%, так как иногда я получаю сообщение дважды. Это также может быть вызвано ошибочной реализацией на устройстве, с которым я общаюсь. Чтобы выяснить, какая из последних точек указывает, я пытаюсь выяснить, сколько байтов действительно находится в принимающем буфере, когда я получаю событие «NSStreamEventHasBytesAvailable». Поскольку я не знаю наверняка, что моя реализация верна, но я хотел знать фактическое количество байтов, которые я получил, я хотел использовать getBuffer: length: и взглянуть на длину после этого. Странная вещь: длина никогда не печатается на консоли, как [((NSInputStream *) stream) getBuffer: &buf length: &numBytes] всегда оценивается как ЛОЖЬ. Во всяком случае, часть кода впоследствии работает правильно, получает сообщение в буфере и передает его правильно - работает хорошо. Остается вопрос: почему не работает getBuffer: length:? Код интереса здесь:

` case NSStreamEventHasBytesAvailable: {

        uint8_t *buf;
        unsigned int numBytes;

        if ([((NSInputStream *) stream) getBuffer: &buf length: &numBytes]) {
            NSLog(@"\t\tBytes in the buffer: %i", &numBytes);
        }

        uint8_t buffer[BUFFER_SIZE];
        int len = [((NSInputStream *) stream) read: buffer 
                                         maxLength: BUFFER_SIZE];
        NSLog(@"\tread: %i bytes", len);

        /*
         if len > 0: len is equal to the filled byte elements
         if len == 0: end of buffer was reached while reading
         if len < 0: something terrible happened...
         */
        if (len > 0) {
            /* 1. create string from received byte buffer */
            NSString *msg = [[NSString alloc] initWithBytes: buffer length: len encoding: NSASCIIStringEncoding];
            NSLog(@"\tcontained message: %@", msg);
            /* 2. inform communicator about received message */
            [communicator received: msg];
            [msg release];
        }

        if (len < 0) {
            [communicator received: @"Error!"];
        }
        break;
    }

`

Было бы неплохо, если бы кто-то мог мне помочь!

Ответы [ 3 ]

10 голосов
/ 15 декабря 2010

Дарвин с открытым исходным кодом, так что «правда там».Источник для NSStream показывает, что GSInetInputStream - это класс, который реализует NSInputStream для сокета, а реализация getBuffer: length: для этого класса отвечает на вопрос кратко:

- (BOOL) getBuffer: (uint8_t **)buffer length: (unsigned int *)len
{
  return NO;
}

Найдено здесь .

0 голосов
/ 10 ноября 2010

ах, я думаю, я понял, что вы имеете в виду.но я полагаю, что следующий код должен оцениваться в TRUE по крайней мере после чтения в буфер?я просто спрашиваю, потому что это не так, getBuffer:length: все еще, кажется, не работает.связь с использованием доступных байтов работает хорошо, но вопрос остается ...

        uint8_t *buf1;
        unsigned int numBytes1;
        if ([((NSInputStream *) stream) getBuffer: &buf length: &numBytes]) {
            NSLog(@"\t\tBytes are in the buffer before Op.");
        }

        uint8_t buffer[BUFFER_SIZE];
        int len = [((NSInputStream *) stream) read: buffer 
                                         maxLength: BUFFER_SIZE];

        uint8_t *buf2;
        unsigned int numBytes2;
        if ([((NSInputStream *) stream) getBuffer: &buf2 length: &numBytes2]) {
            NSLog(@"\t\tBytes in the buffer after Op.");
        }

извините за создание ответа на мой собственный вопрос;но комментарий смог обработать так много кода ...

0 голосов
/ 01 ноября 2010

Я думаю, что getBuffer не работает, потому что еще нет буфера, вы читаете в буфер впоследствии, поэтому он пока не может получить указатель на буфер ...

...