Как отправить целое число через NSOutputStream? - PullRequest
3 голосов
/ 25 июня 2011

Итак, я делаю приложение для iOS, которое постоянно отправляет и массив точек через NSStream с, но поскольку иногда отправитель записывает два массива до того, как получатель его получает, я решил сначала записать длину, а затем данные массива.сам, так что получатель знает, сколько байтов для обработки.

отправитель:

if (_outStream && [_outStream hasSpaceAvailable]){
    const uint8_t *buffer = [data bytes];
    uint64_t length = CFSwapInt64HostToLittle([data length]);
    NSLog(@"Sending bytes with length: %llu", length);
    int er1 = [_outStream write:(const uint8_t *)&length maxLength:sizeof(length)];
    int er2 = [_outStream write:buffer maxLength:length];  
    if (er1 < 0 || er2 < 0) {
        [self _showAlert:@"Failed sending data to peer"];
    }
}

получатель:

case NSStreamEventHasBytesAvailable:
    {
        if (stream == _inStream) {
            uint8_t *b;
            int len = 0;
            len = [_inStream read:b maxLength:8];
            uint64_t dataLength = CFSwapInt64LittleToHost(*b);
            NSLog(@"Received bytes with length: %llu", dataLength);
            if(len < 0) {
                if ([stream streamStatus] != NSStreamStatusAtEnd)
                    [self _showAlert:@"Failed reading data from peer"];
            } else if (len > 0){
                uint8_t bytes[dataLength];
                int length = [_inStream read:bytes maxLength:dataLength];

                [currentDownload appendBytes:bytes length:length]; 
                 id pointsArray = [NSKeyedUnarchiver unarchiveObjectWithData:currentDownload];
                [currentDownload release];
                currentDownload = [[NSMutableData alloc] init];
                if ([pointsArray isKindOfClass:[NSArray class]]) {
                    [drawScene addNewPoint:[[pointsArray objectAtIndex:0] CGPointValue] previousPoint:[[pointsArray objectAtIndex:1] CGPointValue]];
                }

            }
        }
        break;
    }

Проблема в том, что получатель получает неверныйцелое число, следовательно, он читает неправильное количество байтов.

Кто-нибудь может мне помочь с этим?

1 Ответ

1 голос
/ 26 июня 2011

Может быть, когда вы читаете данные, вы начинаете с вводных битов, предназначенных для передачи длины, а не с фактических данных?

Для:

[currentDownload appendBytes:bytes length:length];

попробуйте заменить что-то вроде этого:

NSRange rangeLeftover = NSMakeRange(sizeof(uint8_t), [currentDownload length] - sizeof(uint8_t));
NSData *dataLeftover = [currentDownload subdataWithRange:rangeLeftover];
uint8_t bytesLeftover[[dataLeftover length]];
[dataLeftover getBytes:&bytesLeftover length:[dataLeftover length]];
currentDownload = [NSMutableData data]; // clear
[currentDownload appendBytes:bytesLeftover length:[dataLeftover length]];
...