Я действительно хотел бы использовать 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;
}
`
Было бы неплохо, если бы кто-то мог мне помочь!