【问题标题】:ios sync socket optionios 同步套接字选项
【发布时间】:2014-10-24 09:39:10
【问题描述】:

我正在开发一个 ios 应用程序以使用 TCP 连接到服务器并将接收到的字节显示到屏幕上。 我使用 NSStream(async) 在互联网上跟踪了许多示例,我确实连接并获取了一些字节。 问题是异步套接字可能会将多个 TCP 数据包合并为一个事件触发器(标准行为)。服务器的回复字节长度是多种多样的,异步套接字似乎无法帮助正确地切分数据包。

不知道sync socket会不会解决这个问题,问题来了:

  1. 是否会如上所述同步套接字合并数据包?
  2. 除了 POSIX(很多文章告诉我不要使用 POSIX),IOS 上同步套接字的其他选项是什么?
  3. 我可以遵循任何示例代码吗?

【问题讨论】:

    标签: ios sockets tcp


    【解决方案1】:

    使用同步调用并不能真正解决您的问题。本质上,TCP 会话只是一个字节流。底层网络堆栈和设备不需要维护传输分组。即使您使用同步/阻塞调用,您仍然可能会从读取请求中返回多个“传输”到您的代码。

    您需要编写代码,以便它可以检测流中包含的离散消息。这通常使用包含消息长度的标头来完成,或者在简单的情况下,使用终止字符(例如回车)

    【讨论】:

    • 我是 objectC(ios) 的新手,但我在 java/C 中从未遇到过这个问题。由于服务器站点上的内容已经固定(没有标题/终止字符,因为它是字节数据)并且我不是唯一使用服务器的客户端。你周围的任何工作都可以建议吗?谢谢。
    • 听起来你的协议“坏了”。依靠 TCP 传输作为分隔符是有缺陷的。您可以使用 UDP 执行此操作,因为每个数据包都是谨慎的
    • 如果服务器的回复频率很低(比如每个数据包 5 秒)怎么办。现在的问题是 hasBytesAvailable 没有触发,10 秒后我一次读取了两个数据包。
    • 没错。该协议依赖于未为 TCP 流定义的行为。它在 TCP/IP 堆栈的特定实现上崩溃只是时间问题,现在它已经崩溃了。
    • 即使我们在谈论我不应该依赖 TCP 数据包作为分隔符。这在性能方面非常差。我是否可以控制 hasBytesAvailable 如何触发?否则会同步套接字帮助吗?
    【解决方案2】:

    最后,我在 C 中使用 POSIX 套接字解决了这个问题。谢谢。

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多