4

特に「大きな」ファイル(5〜10 mb)で、しばらくGCDAsyncSocket(MRC / iOS5.1)で遊んでいます。残念ながら、ストリームの最後に数バイトあるだけで、読み取りストリームが完了しないことがあります (スタックするなど)。はdidReadPartialDataOfLength:私に情報を提供するのをやめ、didReadDataはまったく解雇されません。

これが私のコードの一部です(書き込み/読み取りの両方の例で、ホストとクライアント間の接続が確立されています)

書き込み

#define kHeadTag 0
#define kDataTag 1

typedef struct {
    NSUInteger size;
} head_t;

-(void)sendData:(NSData *)__data  {
    _sendData = [__data retain];

    head_t header;
    header.size = __data.length;
    [_socket writeData:[NSData dataWithBytes:&header
                                   length:sizeof(header)]
       withTimeout:-1
       tag:kHeadTag];
}

-(void)socket:(GCDAsyncSocket *)sock
       didWriteDataWithTag:(long)tag {
    if (tag == kHeadTag) {
        [sock writeData:_sendData withTimeout:-1 tag:kDataTag];
        [_sendData release];
        _sendData = nil;
    }
}

読む

-(void)socket:(GCDAsyncSocket *)sock
       didReadData:(NSData *)data
       withTag:(long)tag {
    switch (tag) {            
            // ------------------------------------- HEAD
        case kHeadTag:{
            head_t head;
            [data getBytes:&head length:sizeof(head)];
            _readHead = head;
            NSLog(@"Received header (total size = %i bytes)", head.size);
            [sock readDataToLength:head.size
                withTimeout:-1
                tag:kDataTag];
        }
            break;

            // ------------------------------------- BODY
        case kDataTag: {
             NSLog(@"Data received with %i bytes", data.length);
             [sock readDataToLength:sizeof(head_t) withTimeout:-1 tag:kHeadTag];
        }
            break;
    }
};

-(void)socket:(GCDAsyncSocket *)sock
       didReadPartialDataOfLength:(NSUInteger)partialLength
       tag:(long)tag {
    if (tag == kDataTag) {
        NSLog(@"Data read with %i bytes", partialLength);
    }
};

これが私が間違っていることを確認するのに十分なコードであることを願っています。または、これが大量のデータの書き込み/読み取りの悪い習慣である可能性があります。

4

1 に答える 1