2009-08-26 7 views
0

Ich versuche mit einer Anwendung über das Netzwerk zu interagieren, die ein einfaches Protokoll verwendet. Ich habe einen Header zu senden, die wie folgt aussieht:Eine 2-Byte-Ganzzahl in einen Stream schreiben?

2 Byte = Datenlänge (einschließlich Anfragetyp)
1 Byte = Request Typ

Ich nehme beiden Parameter als ganze Zahlen:

private static void WriteHeader(Stream buf, int length, int requestType) { 
    buf.Write(BitConverter.GetBytes(length), 0, 2); 
    buf.WriteByte((byte)requestType); 
} 

ich bin es so Berufung:

byte[] outBuf = new byte[256]; 
using (MemoryStream outStream = new MemoryStream(outBuf)) { 
    // Socket connection stuff here 
    WriteHeader(outStream, 1, 110); 
    sock.Send(outBuf); 
    // Receive stuff here, never returns 
} 

Ich erhalte keine Ausnahme, wenn ich diese Methode anrufe oder outBuf über einen Socket sende, aber die Netzwerkanwendung antwortet nie. Ich kann es jedoch mit anderen Programmen abfragen, daher bin ich mir ziemlich sicher, dass dies daran liegt, dass meine Kopfzeile nicht korrekt geschrieben wird.

Mache ich etwas falsch beim Schreiben der Werte?

EDIT: Added Memory Code

+0

Wirf die Länge auf '(kurz) Länge' –

Antwort

2

Welche Art von Strom ist es? Wenn die Eingabe gepuffert wird, werden die Daten möglicherweise niemals über die Leitung gesendet.

Edit:

BitConverter.GetBytes (1) gibt Ihnen [1, 0, 0, 0], von dem Sie passing [1,0]. Vielleicht ist es ein Endian-Thema. Versuchen Sie, [0,1] als Header zu senden.

+0

Es ist ein MemoryStream, der auf ein Byte-Array zeigt. –

+0

Ich denke, das ist es. Wenn {0, 1} direkt an WriteBytes übergeben wird, wird der Empfangsaufruf zurückgegeben. Jetzt ist das einzige Problem, dass der Server keine Daten sendet. Ich denke nicht, dass das ein Problem mit diesem Code ist. –

0

Ich vermute, Sie müssen Ihre Länge kurz machen. Wenn Sie den int in den Stream schreiben, vermute ich, dass Sie nur die ersten zwei Bytes bekommen werden, da der int 4 Bytes beträgt und Sie nur zwei davon auf buf schreiben.

+0

Leider macht es nichts, wenn man es zu kurz ändert. Ich wünschte, es wäre so einfach.:( –

1

Könnte es zu Endian-Problemen zwischen Ihrem Client und dem Server kommen? Sie könnten versuchen, den Netzwerkverkehr mit Wireshark oder einem ähnlichen Tool zu erfassen und dann die gesendeten/empfangenen Pakete mit Ihrem Client im Vergleich zu anderen Anwendungen, die erfolgreich kommunizieren, vergleichen.

+0

Im Moment kann ich die Server-Anwendung nur auf meinem lokalen PC ausführen. Wireshark kann keine Pakete auf localhost erfassen. Ich muss Daten an eine IP-Adresse senden (in diesem Fall 127.0.0.1), was nicht ' t auch mit einem Loopback-Adapter unterstützt. –

1

ein Network Versuchen:

void WriteHeader(Stream s, int len, int cmd) { 
    var buf = new byte[3]; 
    s.Write(BitConverter.GetBytes((UInt16)len)); 
    s.WriteByte((byte)cmd); 
} 

var ns = new NetworkStream(sock); 
WriteHeader(ns, 1, 110); 
1

ich in diesem Code denken Sie an drei Fehlerquellen können:

  • endianness Probleme: Was ist die Byte-Reihenfolge für die 2 Byte Länge, die Sie senden, und sind Sie sicher, dass GetBytes die Bytes in der richtigen Reihenfolge gibt?
  • Paketgröße: Sie senden 256 Byte Daten, obwohl Ihre Nachricht nur 3 Byte groß ist.
  • Nutzlast: Sie fügen keine Nutzlast in die Nachricht ein, aber die Nachricht 110 benötigt möglicherweise zusätzliche Daten.
Verwandte Themen