簡體   English   中英

在C#中創建網絡數據包結構/類的最佳方法是什么?

[英]What is the best method for creating a network packet struct/class in C#?

我想知道是否有任何好的指南或書籍可以解釋處理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
        }
}

除此之外,還有關於將網絡數據解析為可用結構/類的最佳實踐的良好指南或文章?

好了,而不是GetBytes()我會傾向於使用Write(Stream) ,如果是大...但在一般情況下,這是你的序列化API的...我提到我自己,但我認為人們對此無聊。

IMO, hotline_transaction對我來說更像是一個class (而不是struct )。

您聽說過Google協議緩沖區嗎?

協議緩沖區是Google用於其許多數據通信的二進制序列化格式的名稱。 它被設計為:

體積小-高效的數據存儲(遠小於xml),處理便宜-在客戶端和服務器平台上均獨立-可在不同的編程體系結構之間移植,可擴展-可將新數據添加到舊消息中

您可能應該為此使用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);
}

您可以使用BinaryWriter輕松包裝現有Stream 如果確實需要某種方式獲取byte[] ,則可以將MemoryStream用作后備流,並在完成后調用ToArray

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM