【问题标题】:C# order of bytes sent and received by socket套接字发送和接收的 C# 字节顺序
【发布时间】:2015-05-15 12:59:15
【问题描述】:

我想知道 TCP 套接字发送和接收字节的顺序。

我已经实现了套接字,它已经启动并且可以工作了,这很好。 我还有一个叫做“消息”的东西——它是一个字节数组,包含字符串(序列化为字节)和两个整数(转换为字节)。它必须是这样的 - 项目规范:/

无论如何,我想知道它是如何处理字节的: 在字节数组中,我们有字节顺序 - 0,1,2,... Length-1。他们坐在记忆中。

它们是如何发送的?最后一个是第一个发送的吗?还是第一个?我认为接收非常容易——出现的第一个字节位于缓冲区中的第一个空闲位置。

我认为我制作的一张小图很好地说明了我的意思。

【问题讨论】:

  • 为什么您认为顺序可能会颠倒?你一定有什么想法。
  • 请记住,如果您想处理“消息”,则取决于您在 TCP 之上进行框架 - TCP 中的模型只是两个字节流(一个您正在发送和一个你收到的)。一端对 Send 的调用与另一端对 Receive 的调用不匹配。

标签: c# sockets tcp byte bytearray


【解决方案1】:

它们的发送顺序与它们在内存中的顺序相同。否则会更复杂......如果你有一个连续的字节流,你会怎么做?等待最后一个已发送,然后全部撤消?或者这种反转应该“逐包”工作?所以每个 2k 字节的块(或 TCP 数据包的大小)在内部是颠倒的,但数据包的顺序是“正确的”?

我认为接收非常容易——出现的第一个字节位于缓冲区中的第一个空闲位置。

到底为什么发送者应该反转字节而接收者不应该?如果你构建一个对称系统,要么都做,要么都不做!

请注意,真正的问题通常是endianness问题。您计算机上int 的内存布局可能与另一台计算机上int 的布局不同。因此,两台计算机中的一台可能必须反转 int 的 4 个字节。但是字节序是由“原始类型”解决的“原始类型”。由于历史原因,许多 Internet 协议是 Big Endian,而 Intel CPU 是 Little Endian。甚至 TCP 的内部字段也是 Big Endian(参见Big endian or Little endian on net?),但这里我们说的是 TCP 的字段,而不是 TCP 协议移动的数据。

【讨论】:

  • 由于 C#(使用 BitConverter 类将 int 转换为 byte[] 时)使用 little-endian,您可以使用 HostToNetworkOrder 转换它们,然后在通过网络。
  • @Patrick .NET for BitConverter 似乎使用“本地”字节序...referencesource 和使用 Mono code 的最新 Mono 版本似乎都是如此。现在,可悲的是,我没有 XBox360(它是 Big Endian 并支持 .NET)来检查这个......仍然解决方案是正确的...... ReferenceSource 上的HostToNetworkOrder 还可以
  • 是的,你是对的。我忘了提到“Windows 上的 C#”。
猜你喜欢
  • 2013-04-01
  • 2011-07-11
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 2010-11-14
  • 2012-05-27
相关资源
最近更新 更多