Я действительно хотел бы использовать метод 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;
}
`
Было бы хорошо, если бы кто-то может мне помочь!
Привет, вы можете проверить мой [вопрос о getBuffer в Swift] (http://stackoverflow.com/questions/40045665/size-of-the-nsinputstream-buffer)? У меня очень странная проблема, предлагаемые ответы от продвинутых пользователей не работают. С уважением! –