![](/img/trans.png)
[英]What is the best way to wait on a network packet using C#'s new async feature
[英]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.