mikrocontroller.net

Forum: PC-Programmierung TCP/IP Socket: Byte Codierung


Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe ein Problem, das mir das Leben ziemlich schwer macht.

Ich habe einen kleinen TCP/IP-Client, der mir einfach ein Byte-Array mit 
wahllosen Byte-Werten an einen Server senden soll.

Das klappt auch soweit super, nur die Codierung stimmt nicht.

Ein Beispiel:

Ich sende:   08 09 1A 5B 80
Es kommt an: 08 09 1A 5B 3F

Beim letzten Byte liegt ein Codierungsfehler vor, aus 08 wird 3F. Kann 
ich auch bei Wireshark beobachten.


Wie kann ich die Codierung so umstellen, dass es passt?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie soll jemand mit diesem winzigen Bischen an Information irgend 
etwas anfangen? Nirgends in TCP/IP bis rauf zu Layer 4 wird irgend etwas 
umcodiert.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da TCP eine Prüfsumme hat, wirst du wohl das falsche senden.

Autor: PJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso, funktioniert doch alles.

Du wolltest wahllose Werte, und bekommst sie auch!

SCNR ;-)

Oder meintest Du zahllose Werte? :-D

Hmm, wahrscheinlich doch quallose ...

Ok, eins sieht man aber: 0x80 ist (bis auf ein Bit, und zwar das Bit in 
0x40) ein invertiertes 0x3F. Vielleicht hilft ja das irgendwie.

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung, habe eben auch festgestellt, dass der Hilferuf 
ziemlicher Murks war. Ich machs besser:


Ich will von meinem C#-Client irgendwelche Bytefolgen an einen Server 
schicken. Die Länge der Daten ist vorerst egal, ebenso ihr Inhalt.

Nun habe ich eben beobachtet, dass es beim Senden der Daten prinzipiell 
keine Probleme gibt, außer beim 0x80 (evtl. noch bei anderen, bin noch 
nicht alle 255 Möglichkeiten durchgegangen). Werte wie 0x49 oder 0xFF 
lassen sich dagegen problemlos übertragen.

Dass zwischen 0x80 und 0x3F ein gewisser Zusammenhang besteht fiel mir 
auch auf, der Dreher wird ja auch sicher nicht ohne Grund geschehen.

Ich hatte so ein Ähnliches Problem mal beim Übertragen von Daten über 
die serielle Schnittstelle. Damals habe ich mit:

SerialPort.System.Text.Encoding.GetEncoding(28591);

die Coderierung umgestellt. Allerdings scheint es diese Möglichkeit beim 
TCP/IP socket nicht zu geben.

Codes:

1. Initialisierung des Client-Socket
        IPHostEntry hostInfo = Dns.GetHostByName(Address);
        //System.Net.IPEndPoint ep = new System.Net.IPEndPoint(IPAddress.Parse(Address),port);
        System.Net.IPEndPoint ep = new System.Net.IPEndPoint(hostInfo.AddressList[0],port);
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
        socket.Connect(ep);

2. Senden von Daten

string text = "\x49" + "\x80" + "\xff" + "\xff";

client.send(System.Text.Encoding.Default.GetBytes(text));
         
//...

return socket.Send(data);

Mit System.Text.Encoding.Default.GetBytes(text)) kann ich den string 
zwar Codieren, die zur Verfügung stehenden Codierungsmöglichkeiten lösen 
aber nicht mein Problem, das der best case aller Codierungen noch eben 
der mit dem 0x80->0x3F Problem darstellt.

Autor: PJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst ja mal für das letzte Byte einen Zähler von 0 bis 0xff 
verwenden und die 256 empfangenen Messages anschauen, vielleicht wird 
dabei irgendein System sichtbar.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum schickst du auch strings ab. Wenn du ein array aus byte 
verschicken willst.


char[]  tmp = new char[5] ;
tmp[0] = 12;
tmp[1] = 80;
tmp[2] = 12;
tmp[3] = 72;
tmp[4] = 12;

socket.Send(tmp);

Autor: Axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn da 0x3F auf dem Wire ist, dann sendest Du das auch. Also vergißt Du 
beim kopieren des Arrays in den Sendebuffer offenbar ein Byte.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du nicht zwischen verschiedenen Zeichensätzen umcodieren sondern 
exakt 1:1 übertragen willst, warum codierst du dann um?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.