在C#中创建网络数据包结构/类的最佳方法是什么?

时间:2009-08-19 22:43:55

标签: c# networking

我想知道是否有任何好的指南或书籍可以解释在C#中处理网络数据包通信的最佳方法?

现在我正在使用一个结构和一个基于结构值生成字节数组的方法。

有更简单的方法吗?或者甚至更好的方式?

public struct hotline_transaction
{
        private int transaction_id;
        private short task_number;
        private int error_code;
        private int data_length;
        private int data_length2;

...

        public int Transaction_id
        {
            get
            {
                return IPAddress.HostToNetworkOrder(transaction_id);
            }
            set
            {
                transaction_id = value;
            }
        }

...

        public byte[] GetBytes()
        {
            List<byte> buffer = new List<byte>();
            buffer.Add(0); // reserved
            buffer.Add(0); // request = 0

            buffer.AddRange(BitConverter.GetBytes(Task_number));
            buffer.AddRange(BitConverter.GetBytes(Transaction_id));
            buffer.AddRange(BitConverter.GetBytes(error_code));


            buffer.AddRange(BitConverter.GetBytes(Data_length));

            buffer.AddRange(subBuffer.ToArray());

            return buffer.ToArray(); // return byte array for network sending
        }
}

除此之外,是否有关于将网络数据解析为可用结构/类的最佳实践的指南或文章?

3 个答案:

答案 0 :(得分:2)

嗯,而不是GetBytes(),我会被诱惑使用Write(Stream),以防它很大......但是在一般情况下有这样的序列化API ...我提到我自己,但我认为人们听到它会感到无聊。

IMO,hotline_transaction看起来更像class(而非struct)给我,顺便说一句。

答案 1 :(得分:2)

您听说过google protocol buffers吗?

  

协议缓冲区是的名称   二进制序列化格式   谷歌的大部分数据   通信。它旨在:

     

体积小 - 高效的数据存储   (远小于xml)便宜到   过程 - 在客户端和   服务器平台独立 - 便携式   不同节目之间   架构可扩展 - 添加新的   数据到旧消息

答案 2 :(得分:0)

您可能应该使用BinaryWriter,而不是返回byte[],您应该将BinaryWriter传递给序列化代码,即

public void WriteBytes(BinaryWriter writer)
{
    writer.Write((byte)0); // reserved
    writer.Write((byte)0); // request = 0

    writer.Write(Task_number);
    writer.Write(Transaction_id);
    writer.Write(error_code);

    writer.Write(Data_length);

    subBuffer.WriteBytes(writer);
}

您可以使用Stream轻松打包现有BinaryWriter。如果您确实需要以某种方式获得byte[],则可以使用MemoryStream作为后备流,并在完成后致电ToArray