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?
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.
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.
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.
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.
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);
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.