0

我的应用程序使用 AsyncSocket 通过 TCP 与服务器通信。通信有两种情况:

  1. 应用程序向服务器发送一些东西,服务器做出响应。应用程序需要读取此响应并对其中的信息进行处理。这个响应总是相同的长度,例如,一个响应总是 6 个字节。

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

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

我想我可以做点什么readDataWithTimeout:tag:,将超时设置为-1。我相信,这使得套接字不断地监听任何进来的东西。但是,这可能会干扰响应我发送的内容而传入的数据(情况 1)。该应用程序无法再区分来自情况 1 或情况 2 的传入数据。

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

4

1 回答 1

1

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

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

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

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

于 2012-11-16T20:19:42.847 回答