【问题标题】:Send two packets (one with length and one with data) or send one concatenated packet?发送两个数据包(一个带长度,一个带数据)还是发送一个连接的数据包?
【发布时间】:2011-09-20 21:10:36
【问题描述】:

哪个更好?

在每个之前假设这个代码:

byte[] data = Encoding.ASCII.GetBytes("Test Packet Message");
byte[] header = BitConverter.GetBytes(data.Length);

答:

clientStream.Write(header, 0, header.Length);
clientStream.Write(data, 0, data.Length);

乙:

byte[] bytes = new byte[header.Length + data.Length];

Buffer.BlockCopy(header, 0, bytes, 0, header.Length);
Buffer.BlockCopy(data, 0, bytes, header.Length, data.Length);

clientStream.Write(bytes, 0, bytes.Length);

A 的好处是不必将字节从一个数组复制到另一个数组,因此在 CPU 上更容易(客户端和服务器都必须发送和接收数据,因此 A 如果发送大量数据,该方法可能会更快。

B 的好处是只发送一个数据包。人们谈论发送单个小数据包的开销。此外,从this post 可以看出,Nagle 的算法可能会与 A 一起使用。

如果有一种方法也能完成 A 而不必将所有字节从标头和数据数组复制到字节数组,那就太好了,但我不确定这是否可能.. 似乎有一种方法可以优化它/使其更高效,但我不确定。

【问题讨论】:

  • 我认为你在认真考虑这一点,只需将其写入流。我不清楚为什么版本 1 会导致两个数据包在线上
  • 您或 TCP/IP 驱动程序是否连接字节并不重要。虽然司机可能会这样做,但头发更快。这种微优化是在浪费你的时间。你需要开始测量而不是猜测。
  • Hans Passant:通常我只会做第一个,但this post 让我很好奇。
  • @BrokenGlass:你觉得this post怎么样?这在很大程度上是创建此线程的灵感..
  • @John:那时我承认失败了——我认为这根本不重要——我仍然持怀疑态度——但其他帖子中提到的细节超出了我的范围。

标签: c#


【解决方案1】:

我希望以下接受多个缓冲区的方法能够实现您所寻找的。但是,我想对其进行测试,以确定以数据包的形式发送的确切内容。

//Sends the set of buffers in the list to a connected Socket, using the specified SocketFlags.
Socket.Send Method (IList<ArraySegment<Byte>>, SocketFlags)

请参阅以下帖子:

UDP - Can I send two datagram parts, and make the receiving end combine them into one?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2010-10-20
    相关资源
    最近更新 更多