Warum wird der Endian nach dem Senden über TCP umgekehrt?

8

Ich habe einen Client in C # geschrieben und einen Server in Python geschrieben. Die Nachrichten, die ich über den Socket sende, sind 8 Bytes, gefolgt von den Daten, die 8 Bytes sind die Datenlänge.

In C # vor dem Senden konvertiere ich die 8-Byte-Datenlänge zu groß Endian wie gezeigt:

%Vor%

Die Nachricht wird erfolgreich gesendet und ich werde in den Python-Server-Code eingebunden, da das Entpackungsformat hier korrekt sein sollte, oder?

%Vor%

Ist das Big-Endian-Zeichen '& gt;' nicht? Warum ist meine Länge so lang?

UPDATE:

Es gab einen Fehler, bei dem ich die falschen 8 Bytes entpackte, das wurde behoben, jetzt, da ich die korrekten Daten entpacke, habe ich immer noch dieselbe Frage.

%Vor%

Die richtige Länge wird nur angegeben, wenn ich mit Little Endian entpacke, obwohl ich die Bytes mit big-endian an den Server gesendet habe ... also erwarte ich, dass & gt; Q funktioniert, aber stattdessen

%Vor%

Hier ist, wie ich die Bytes in Python erhalte:

%Vor%     
user740521 11.10.2017, 18:03
quelle

3 Antworten

8

Etwas stimmt nicht mit Ihrem Code:

  

Länge ist 1658170187863248538

Dies ist in hex 1703010020BB4E9A. Das hat nichts mit einer Länge von 8 zu tun, egal um welche Endlichkeit es sich handelt. Stattdessen sieht es verdächtig wie ein TLS-Datensatz aus:

%Vor%

Da laut Ihrem Code SSL gemacht wird, liegt wahrscheinlich etwas falsch in Ihrem Empfänger. Meine Vermutung ist, dass Sie anstelle des SSL-Sockets von der Plain-Socket lesen und somit die verschlüsselten Daten anstelle der entschlüsselten Daten lesen.

    
Steffen Ullrich 11.10.2017, 18:47
quelle
1

Nach Ссылка kehren Sie 9 Bytes um, wenn Sie Aufrufen:

%Vor%

und nach Ссылка ein ulong in C # ist nur 8 Bytes.

Ich glaube nicht, dass dies notwendigerweise eine Antwort ist, aber vielleicht ist es ein Hinweis?

    
Rob Fagen 21.10.2017 01:57
quelle
1

Wenn Sie auf der Clientseite Daten zum Streamen schreiben, führen Sie zwei Schreibaufrufe aus:

%Vor%

MSDN sagt über NetworkStream.Write : Die Write-Methode blockiert, bis die angeforderte Anzahl von Bytes gesendet oder eine SocketException ausgelöst wurde. Auf der Serverseite gibt es keine Garantie, dass Sie alle Bytes in einem Empfangsaufruf erhalten - Das hängt von OS, eth driver / config usw. ab. Also musst du mit diesem Szenario umgehen. Wie ich in Ihnen sehen kann, behandeln Sie es, indem Sie 8 oder weniger Bytes lesen, aber Sockel. recv sagt, es ist besser, größere Mengen zu erhalten. Hier ist meine Implementierung des Servers auf Python. Es erstellt Binärdatei im aktuellen Ordner mit empfangenen Bytes - möglicherweise hilfreich, um zu analysieren, was falsch ist. Um den Listening-Port zu setzen, muss -p / - port argument:

verwendet werden %Vor%

Um dieses Beispiel vollständig zu machen, hier ist C # -Client. Es verwendet eine externe Bibliothek - Newtonsoft.Json für die Serialisierung:

%Vor%

    
Artavazd Balayan 21.10.2017 22:27
quelle

Tags und Links