wxWidgets, Unicode und Sockets
-
Hallo allerseits,
ich habe mich entschieden, nun den Versuch zu wagen und wxWidgets mit Unicode zu nutzen und schon stehe ich vor einem echten Problem ...
Ich habe eine Server- und ein Client-Anwendung geschrieben, die beide mittels identischer Funktionen Daten übertragen sollen.
Diese Funktionen sehen wie folgt aus:
wxSocketBase& TCPConnection::SendMsg(wxInt8 cmd,const wxString& msg) { wxString data; wxUint32 len = (wxUint32)msg.Len(); wxUint8 size[sizeof(wxUint32)]; size[0] = (wxUint8)(len & 0xFF); size[1] = (wxUint8)((len >> 8) & 0xFF); size[2] = (wxUint8)((len >> 16) & 0xFF); size[3] = (wxUint8)((len >> 24) & 0xFF); data = wxString((wxUint8*)&cmd,sizeof(wxUint8))+wxString((wxUint8*)size,sizeof(wxUint32))+msg; return Write(data.c_str(),sizeof(wxUint8)*(wxUint32)data.Len()); } wxSocketBase& TCPConnection::RecvMsg(wxInt8& cmd,wxString& msg) { Read((wxInt8*)&cmd,sizeof(wxInt8)); if (Error()) return *this; wxUint8 size[sizeof(wxUint32)]; Read((wxUint8*)size,sizeof(wxUint32)); if (Error()) return *this; wxUint32 len = (wxUint32)size[0]; len |= (wxUint32)(size[1] << 8); len |= (wxUint32)(size[2] << 16); len |= (wxUint32)(size[3] << 24); if (!len) return *this; wxUint8* data = new wxUint8[len]; Read(data,len); if (Error()) { delete[] data; return *this; } msg = wxString(data,len); delete[] data; return *this; }
Die Basisklasse von TCPConnection ist wxSocketClient.
Kurze Erläuterung:
Das erste Byte soll ein Kommando-Byte sein, an welchem der Empfänger erkennen kann, um welche Art von Nachricht es sich handelt.
Die folgenden vier Bytes setzen einen unsigned int zusammen, welche die Länge der dann folgenden Nachricht enthalten soll, damit diese vollständig gelesen werden kann.Beim Übertragen kommt es aber zu zwei unschönen Fehlern:
1. Wird die Länge der Daten falsch berechnet/übertragen (viel zu groß)
2. Kommen von der Nachricht die ersten zwei Zeichen nicht an.Was stimmt hier nicht? Was muss ich tun, damit ich auch mit Unicode korrekt übertragen kann? Mit ANSI funktionierte das tadellos!
Viele Grüße,
Max
-
Moin Max,
data.c_str()
liefert in Unicode kein char* sondern ein wchar* und damit werden dann auch die falschen Werte übertragen.
Anstelle von data.c_str() solltest mal data.char_str() versuchen.
BTW wenn du, wie im code fragment, keinen Längencheck machst (brauchst), dann solltes du auf ReadMsg/WriteMsg ausweichen und den Befehlscode einfach vor den Messagestring packen bzw. von dort wieder extrahieren. (Längenberechnung kannst du dann weglassen)
HTH
denk_mal
-
Danke!