我正在玩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);
}
};
我希望这是足够的代码来查看我做错了什么,或者这对于编写/读取大块数据来说可能是一种不好的做法。
答案 0 :(得分:0)
我添加了
[self.partnerSocket writeData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];
在sendData:方法的末尾,它对我来说很好。您只需在数据末尾附加分隔符字符即可。
我可以将大约48MB的文件从一个iDevice传输到其他iDevice