2010-10-29 2 views
3

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

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

` случай 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; 
    } 

`

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

ответ

10

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

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

Найдено here.

+0

Привет, вы можете проверить мой [вопрос о getBuffer в Swift] (http://stackoverflow.com/questions/40045665/size-of-the-nsinputstream-buffer)? У меня очень странная проблема, предлагаемые ответы от продвинутых пользователей не работают. С уважением! –

0

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

+0

не имеет смысла, так как этот код выполняется только после получения события «NSStreamEventHasBytesAvailable», поэтому в базовом буфере есть данные, которые я хочу получить ссылкой, вызывая 'getBuffer: length:' ,я просто переместил блок 'if getBuffer: length:' под блоком 'read: maxLength: 'и, как и ожидалось: ничего не изменилось –

+0

далее: я пытаюсь ПРОЧИТАТЬ ОТ этого буфера, не впиваясь в него (я думаю, что это то, что вы имели в виду «чтение в буфер»?). –

+0

событие, доступное для байтов, не означает, что они еще находятся в буфере, есть байт, готовый к чтению в буфер из потока. притворите, что вы открываете поток в файл, когда вы открываете поток, есть байты, доступные над потоком, который нужно прочитать, но ни один из файлов еще не был прочитан в буфере. Посредством «чтения в буфер» я имел в виду получение байтов над потоком и помещение их в буфер. – Oliver

0

ах, я думаю, я понимаю, что вы имеете в виду. но я полагаю, что следующий код должен затем оцениваться до ИСТИНЫ по крайней мере после чтения в буфер? Я просто спрашиваю, потому что это не так, 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

Что произойдет, если вы измените numbytes на NSUInteger вместо "unsigned int"? – Oliver

+0

буфер недоступен, ни до, ни после чтения: maxLength: . не имеет значения для меня, поскольку я отлаживал эту часть моего приложения без getBuffer: length: . спасибо, за ваше время, Оливер! –

Смежные вопросы