2009-08-19 4 views
2

Ich frage mich, ob es gute Anleitungen oder Bücher gibt, die den besten Weg erklären, mit der Netzwerkpaketkommunikation in C# umzugehen?Was ist die beste Methode zum Erstellen einer Netzwerkpaketstruktur/Klasse in C#?

Momentan verwende ich eine Struktur und eine Methode, die ein Byte-Array basierend auf Werten der Struktur generiert.

Gibt es einen einfacheren Weg, dies zu tun? Oder noch ein besserer Weg?

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

Darüber hinaus gibt es eine gute Anleitung oder Artikel über die beste Praxis der Analyse von Netzwerkdaten in nutzbare Strukturen/Klassen?

+0

Ich hätte wahrscheinlich geklärt, dass es sich um ein bereits etabliertes Protokoll handelt. –

Antwort

2

Haben Sie schon von google protocol buffers gehört?

Protokollpuffer ist der Name des Binärformat Serialisierung von Google verwendet für einen großen Teil ihrer Daten Kommunikation. Es ist so konzipiert sein:

klein - effiziente Datenspeicherung (viel kleiner als xml) billig Prozess - sowohl auf dem Client und Server plattformunabhängig - tragbare zwischen verschiedenen Programmier Architekturen erweiterbar - hinzufügen neue Daten zu alten Nachrichten

+0

Nun, wenn es nur eine C# -Implementierung dieser API gäbe, die einfach durch Hinzufügen einiger Attribute zu einer bestehenden Klasse nachgerüstet werden könnte ... (hust) ;-p –

2

Nun, anstatt GetBytes(), würde ich versucht sein, eine Write(Stream) zu verwenden, falls es groß ist ... aber im allgemeinen Fall gibt es Serialisierungs-APIs für diese ... Ich würde meine eigene erwähnen, aber Ich denke, dass es den Leuten langweilig wird, es zu hören.

IMO sieht hotline_transaction eher wie ein class (als ein struct) zu mir, btw.

+0

+1 für Klasse/Struktur Unterscheidung. Veränderliche Strukturen sind das Böse, das Böse. –

+0

Ich bin mir nicht sicher, warum ich eine Struktur verwendet habe, es könnte leicht eine Klasse sein und tatsächlich, nachdem ich die Unterschiede zwischen Strukturen und Klassen betrachtet habe, macht dies eine Klasse sinnvoller. –

0

Sie sollten wahrscheinlich eine BinaryWriter dafür verwenden und statt byte[] Rückkehr, sollten Sie eine BinaryWriter zum Serialisierungscode passieren, dh

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

Sie können ein vorhandenes Stream problemlos mit einem BinaryWriter umhüllen. Wenn Sie wirklich eine byte[] irgendwie erhalten müssen, können Sie eine MemoryStream als einen unterstützenden Strom verwenden und ToArray aufrufen, wenn Sie fertig sind.

Verwandte Themen