gpt4 book ai didi

iphone - GCDAsyncSocket - 读取流永远不会完成

转载 作者:可可西里 更新时间:2023-11-01 06:16:28 25 4
gpt4 key购买 nike

我正在使用 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);
}
};

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

最佳答案

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

关于iphone - GCDAsyncSocket - 读取流永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12856524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com