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


von Flo (Gast)


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?

von (prx) A. K. (prx)


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.

von Peter (Gast)


Lesenswert?

Da TCP eine Prüfsumme hat, wirst du wohl das falsche senden.

von PJ (Gast)


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.

von Flo (Gast)


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
1
        IPHostEntry hostInfo = Dns.GetHostByName(Address);
2
        //System.Net.IPEndPoint ep = new System.Net.IPEndPoint(IPAddress.Parse(Address),port);
3
        System.Net.IPEndPoint ep = new System.Net.IPEndPoint(hostInfo.AddressList[0],port);
4
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
5
        socket.Connect(ep);

2. Senden von Daten
1
string text = "\x49" + "\x80" + "\xff" + "\xff";
2
3
client.send(System.Text.Encoding.Default.GetBytes(text));
4
         
5
//...
6
7
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.

von PJ (Gast)


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.

von Peter (Gast)


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

von Axel (Gast)


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.

von (prx) A. K. (prx)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.