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


Anmelden zum Antworten