Frage

Ich versuche, mit einer Anwendung über das Netzwerk zu interagieren, die ein einfaches Protokoll verwendet. Ich muss einen Kopfball schicken, der so aussieht:

2 Bytes = Datenlänge (einschließlich Anforderungstyp)
1 Byte = Anforderungsart

Ich nehme beide Parameter als Ganzzahlen:

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

Ich nenne es so:

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 bekomme keine Ausnahme, wenn ich diese Methode aufzurufen oder zu senden outBuf Über eine Steckdose, aber die Netzwerkanwendung antwortet nie. Ich kann es jedoch mit anderen Programmen abfragen, also bin ich mir ziemlich sicher, dass es daran liegt, dass mein Header nicht richtig geschrieben wird.

Mache ich beim Schreiben der Werte etwas falsch?

BEARBEITEN: MemoryStream -Code hinzugefügt

War es hilfreich?

Lösung

Welche Art von Stream ist das? Wenn es Ihre Eingabe puffern, werden die Daten möglicherweise nie über den Kabel gesendet.

Bearbeiten:

BitConverter.getBytes (1) gibt Ihnen [1, 0, 0, 0], aus denen Sie [1,0] bestehen. Vielleicht ist es ein Endian-Problem. Versuchen Sie [0,1] als Header.

Andere Tipps

Könnte es Endian-Ness-Probleme zwischen Ihrem Client und dem Server geben? Sie könnten versuchen, den Netzwerkverkehr mit dem Netzwerk zu erfassen Wireshark oder ein ähnliches Tool und vergleichen Sie dann die Pakete, die mit Ihrem Kunden gesendet/empfangen wurden, mit einer anderen Anwendung, die erfolgreich kommuniziert.

Versuchen Sie es mit einem Netzwerk:

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

Ich kann mir drei Fehlerquellen in diesem Code vorstellen:

  • Endiangness -Probleme: Was ist die Byte -Reihenfolge für die 2 -Bytes -Länge, die Sie senden, und sind Sie sicher, dass GetBytes die Bytes in der richtigen Reihenfolge gibt?
  • Paketgröße: Sie senden 256 Bytes Daten, obwohl Ihre Nachricht nur 3 Bytes beträgt.
  • Nutzlast: Sie setzen keine Nutzlast in die Nachricht ein, aber Message 110 erfordern möglicherweise zusätzliche Daten.

Ich vermute, Sie müssen Ihre Länge kurz machen. Wenn Sie den int in den Stream übertreffen, werden Sie vermute, dass Sie nur die beiden besten Bytes bekommen, da der INT 4 Bytes ist und Sie nur zwei von ihnen zu BUF schreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top