GCDAsyncSocket - 读取流永远不会完成

时间:2012-10-12 09:54:55

标签: iphone objective-c ios gcdasyncsocket

我正在玩GCDAsyncSocket(MRC / iOS5.1)一段时间,尤其是“大”文件(5 - 10 mb)。不幸的是,有时读取流永远不会完成(例如它被卡住),只是在流的末尾只有几个字节; 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);
    }
};

我希望这是足够的代码来查看我做错了什么,或者这对于编写/读取大块数据来说可能是一种不好的做法。

1 个答案:

答案 0 :(得分:0)

我添加了 [self.partnerSocket writeData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0]; 在sendData:方法的末尾,它对我来说很好。您只需在数据末尾附加分隔符字符即可。 我可以将大约48MB的文件从一个iDevice传输到其他iDevice

相关问题