Quelle est la meilleure méthode pour créer une structure / classe de paquet réseau en C #?

Je me demande s’il existe de bons guides ou de bons livres expliquant le meilleur moyen de gérer la communication par paquets réseau en C #?

Actuellement, j’utilise une structure et une méthode qui génère un tableau d’octets basé sur les valeurs de la structure.

Y a-t-il un moyen plus simple de faire cela? Ou même un meilleur moyen?

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 buffer = new List(); 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 } } 

Au-delà de cela, existe-t-il un bon guide ou article sur la meilleure pratique d’parsing syntaxique des données réseau en structures / classes utilisables?

Avez-vous entendu parler des tampons de protocole Google ?

tampons de protocole est le nom du format de sérialisation binary utilisé par Google pour la plupart de ses communications de données. Il est conçu pour être:

taille réduite – stockage de données efficace (beaucoup plus petit que xml) – traitement peu coûteux – indépendamment de la plate-forme client et de la plate-forme serveur – portable entre différentes architectures de programmation extensibles – pour append de nouvelles données à d’anciens messages

Eh bien, plutôt que GetBytes() , je serais tenté d’utiliser un Write(Stream) , au cas où il serait gros … mais dans le cas général, il existe des API de sérialisation pour cela … Je mentionnerais la mienne, mais je pense que les gens s’ennuient de l’entendre.

IMO, hotline_transaction ressemble plus à une class (qu’une struct ) pour moi, d’ailleurs.

Vous devriez probablement utiliser un BinaryWriter pour cela, et plutôt que de retourner byte[] , vous devriez passer un BinaryWriter au code de sérialisation, c’est-à-dire

 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); } 

Vous pouvez facilement envelopper un Stream existant avec un BinaryWriter . Si vous avez vraiment besoin d’obtenir un byte[] manière ou d’une autre, vous pouvez utiliser un MemoryStream comme stream de sauvegarde et appeler ToArray lorsque vous avez terminé.