【问题标题】:TCPSteam package combine multiple packagesTCPSteam 包组合多个包
【发布时间】:2021-12-11 06:54:40
【问题描述】:

我对 Rust 中的 TCPStream 包有疑问。我想从服务器读取数据。问题是不能保证数据在一个 TCP 包中发送。
我的问题来了: 已读消息是否能够读取多个包,还是我必须调用多个包?有没有“最佳实践”?

【问题讨论】:

  • 你指的是什么TCPStream?来自stdtokio 或其他地方的那个?无论哪种方式,它都应该是对发送的物理数据包的抽象。调用.read() 本身可能会产生部分结果,可能需要多次调用,但通常您应该只阅读您希望使用.read_exact() 阅读的内容,它会为您处理。

标签: sockets rust client


【解决方案1】:

来自用户空间的 TCP 数据包是不可见的,它们的边界无关紧要。相反,用户空间只读取一个字节流,只写入一个字节流。打包是在较低级别以最佳延迟和带宽的方式完成的。很可能会发生来自用户空间的多个write 最终会出现在同一个数据包中,也可能会发生单个write 会导致多个数据包。 read 也是如此:它可能会获取数据包的一部分,也可能会从多个连续的数据包中获取有效负载...

来自底层传输的任何数据包边界不再从用户空间可见。因此,使用 TCP 的协议必须在字节流之上实现自己的消息语义。

所有这些都不是 Rust 特有的,也适用于其他编程语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多