gpt4 book ai didi

iphone - CocoaAsyncSocket 和从套接字读取数据

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

在我基于 TCP 套接字的服务器上,我通过流发送数据包,其中数据包包含一个 header ,指定数据包中的字节数,后跟该字节数。对于那些熟悉 Erlang 的人来说,我只是简单地设置了 {packet, 4} 选项。在 iOS 端,我的代码看起来像这样,假设我想计算出此消息的流的大小:

[asyncSocket readDataToLength:4 withTimeout:-1 tag:HEADER_TAG];

这工作正常,调用了以下委托(delegate)方法回调:

onSocket:didReadData:withTag:

我认为下一个合乎逻辑的步骤是计算流的大小,我用:

  UInt32 readLength;
[data getBytes:&readLength length:4];
readLength = ntohl(readLength);

在服务器端硬编码一个 12 字节的字符串后,readLength 在客户端确实也读取了 12,所以到目前为止一切都很好。我继续以下操作:

 [sock readDataToLength:readLength withTimeout:1 tag:MESSAGE_TAG];

此时回调 onSocket:didReadData:withTag: 不再被调用。取而代之的是读取超时,可能是因为我没有正确处理读取,调用了这个委托(delegate)方法:

- (NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length 

服务器总共发送了 16 个字节,一个 4 字节的 header 和一个 12 字节的二进制流。

我确信错误出在我使用 CocoaAsyncSocket 的方式上。在我计算出流的大小后,读取流的其余部分的正确方法是什么?

** 更新**

我更改了我的客户端,它现在似乎可以正常工作了。问题是,我不明白新解决方案中 readDataToLength 的意义。这是我将初始阅读更改为:

[socket readDataWithTimeout:-1 tag:HEADER_TAG];

现在在回调中,我只需执行以下操作:

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
if (tag == HEADER_TAG) {
UInt32 readLength;
[data getBytes:&readLength length:4];
readLength = ntohl(readLength);
int offset = 4;
NSRange range = NSMakeRange(offset, readLength);
char buffer[readLength];
[data getBytes:&buffer range:range];
NSLog(@"buffer %s", buffer);
//[sock readDataToLength:readLength withTimeout:1 tag:MESSAGE_TAG];
} else if (tag == MESSAGE_TAG) {
//[sock readDataToLength:4 withTimeout:1 tag:HEADER_TAG];
}

}

所以一切都以一个原子有效载荷的形式出现。也许这是因为 Erlang {packet, 4} 的工作方式。我希望是这样。否则,readDataToLength 有什么意义?客户端无法提前知道消息的长度,那么在什么情况下使用该方法比较合适?

最佳答案

我想这取决于您从 Erlang 端发送的方式。选项 {packet, 4} 将发送带有 4 字节长度前缀的每个数据包。 Erlang 中的每个发送操作都会导致发送一个带有长度前缀的数据包(例如,长度 4 的最大大小为 2 Gb)。 Erlang 文档的相关部分适用于 setting the socket options using inet:setopts/2 .

我猜数据是到目前为止从套接字读取的总累积数据。如果该数据包含您的整个数据包,那很好。但如果没有,您可能希望继续使用 readDataToLength 对剩余数据从套接字执行阻塞读取。

关于iphone - CocoaAsyncSocket 和从套接字读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6784872/

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