读取未知数量的传入字节

时间:2012-11-16 19:59:19

标签: ios cocoa-touch cocoaasyncsocket

我的应用使用AsyncSocket通过TCP与服务器通信。有两种情况可以进行沟通:

  1. 应用程序发送服务器的东西,服务器响应。该应用程序需要阅读此响应并对其中的信息执行某些操作。该响应总是相同的长度,例如,响应总是6个字节。

  2. 该应用程序处于“空闲”状态,服务器会在某个时间启动通信(应用程序未知)。应用程序需要读取服务器正在发送的任何内容(可以是任意数量的字节,但第一个字节将指示跟随的字节数,因此我知道何时停止读取)并处理此信息。

  3. 第一种情况正常。 readDataToLength:timeout:tag返回我需要的东西,我可以用它做我想要的东西。这是我不确定如何实施的第二种情况。我不能使用readDataToLength:timeout:tag,因为我事先并不知道长度。

    我想我可以用readDataWithTimeout:tag:做一些事情,将超时设置为-1。我相信,这使得套接字能够不断地听取任何进入的内容。但是,这可能会干扰我发出的数据(情况1)。该应用无法再将情况1或情况2中的传入数据区分开来。

    有谁能帮我解决这个问题?

1 个答案:

答案 0 :(得分:1)

您的错误在网络协议设计中。

除非您的协议具有此信息,否则无法区分响应与服务器启动的通信。并且网络延迟会阻止您可靠地工作所描述的明显的基于时间的方法。

在您的情况下修复协议的一种简单方法(如果服务器启动的消息总是少于255个字节) - 将第7个字节添加到响应的开头,值为FF。

这样你可以readDataWithTimeout:tag:1个字节。 在超时时,您将重试,直到有数据。 如果接收的值为FF,则使用readDataToLength:6 timeout: tag:读取6个字节,并将其解释为对先前发送的请求的响应。 如果是其他值,则使用readDataToLength:theValue timeout: tag:阅读消息,并处理服务器发起的消息。

相关问题