wxSockets zwischen Windows und Linux
-
Hallo *,
ich versuche gerade einen kleinen Chat mit Server und Clienten zu schreiben.
Geht auch alles, nur wenn Server und Clienten auf unterschiedlichen Plattformen laufen, kommt es immer wieder zu Fehlern. Erst mal der Code für den Server:#define MAX_MSGLENGTH 10000 void server::OnClient (wxSocketEvent &event) { //client_array ist ein ein wxArray des Typs wxSocketClient* unsigned int client_number = client_array.Index ((wxSocketClient*)event.GetSocket()); //Gekürzt, nur das für den Empfang if (event.GetSocketEvent() == wxSOCKET_INPUT) { wxChar* msg = new wxChar[MAX_MSGLENGTH]; client_array[client_number]->ReadMsg (msg, MAX_MSGLENGTH * sizeof (wxChar)); //An andere Clienten verteilen size_t len = (wxStrlen(msg) + 1) * sizeof(wxChar); for (unsigned int i = 0; i < client_array.GetCount(); ++i) { if (i == client_number) continue; client_array[i]->WriteMsg (msg, len ); } } }
Dann für den Clienten
void client::OnEnter (wxCommandEvent &event) { const wxChar *msg = eingabefeld->GetValue().c_str(); socket->WriteMsg (msg, (wxStrlen(msg) + 1) * sizeof(wxChar)); nachrichten->AppendText (wxT("Du: ") + wxString(msg, *wxConvCurrent) + wxT("\n")); eingabefeld.Clear(); } void client::OnSocket (wxSocketEvent &event) { //Wieder gekürzt if (event.GetSocketEvent() == wxSOCKET_INPUT) { wxChar* msg = new wxChar[MAX_MSGLENGTH]; socket->ReadMsg (msg, MAX_MSGLENTH * sizeof (wxChar)); wxString input (msg, *wxConvCurrent); //Zur weiterverarbeitung nachrichten->AppendText (input + wxT("\n")); } }
Das Problem ist nun, dass Windows und Linux scheinbar andere Zeichensätze verwenden, und deshalb sizeof (windows_wxChar) != sizeof (linux_wxChar). Wenn ich jetzt von einem Windows Clienten zu einem Linux Clienten etwas schreiben will meckert der Linux Client mit
Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion `g_utf8_validate (text, len, NULL)' failed
Andersrum kommt nur immer das erste Zeichen an. Untereinander funktioniert alles einwandfrei. Meine Idee wäre jetzt, beides in den selben Zeichensatz zu konvertieren, und nach dem Senden wieder zurück, alle bisherigen Versuche schlugen aber fehl, inklusive dem, es in ein char Feld von zu konvertieren und das dann zu senden. Da kamen dann nur seldsame, zufällige (?) Zeichenketten an. Es muss nicht unbedingt so sein, es sollen erstmal nur die "richtigen" Zeichen ankommen.
MfG
Yoschi
-
Ich habe noch ein paar Angaben vergessen:
Unter Linux/Ubuntu nutze ich die wxWidgets Version 2.8.9 aus den Repositories (mit Unicode)
und als Windows Testplattform habe ich mit dem Mingw CrossCompiler eine wxWidgets Version gebaut (auch mit Unicode support).
Die Anwendungen teste ich dann mit Wine.Ich hoffe ihr könnt mir helfen,
yoschi