wxSocketProblem



  • Hi.
    Ich schreibe gerade um mich mit wxWidgets vertraut zu machen ein kleines Chatprogramm damit, und diese Socket-Klassen sind ja eigentlich super.
    Ich habe einen Timer im Clienten gesetzt, um secündlich zu prüfen, ob es was auszulesen gibt, und das mache ich mit einem Buffer:

    WxSocketClientDialog::OnTimerTrigger(wxSocketEvent& event)
    {
        if(Socket->IsDisconnected()){
            wxMessageBox("Kontakt zum Server verloren!", "Client");
            Timer.Stop();
            exit(2);
        }
    
        if(Socket->IsData()){
            Buffer.clear();
            while(Socket->IsData()){
                memset(buf,'\0', 5);
                Socket->Read(buf, 4);
                Buffer.append(buf);
            }
            Text->AppendText(Buffer);
            Text->AppendText("\n");
            wxSound::Play("sndMsg.wav");
        }
    }
    

    der Buffer ist nur zu Testzwecken so klein, da ich später noch Dateien mit Base64 verschicken möchte muss ich dieses System benutzen, das dumme ist nur, dass er nicht in der while schleife bleibt, wenn ich also was längeres schreibe bekomme ich 4 Zeichen Pro sekunde, was muss ich machen, damit er solange in der Schleife bleibt, bis im Socket nichts zu lesen mehr steht??
    Ich wollte das mit Socket-Events lösen, aber egal wie viel ich versucht habe, das wollte einfach nicht klappen. Ich habe es mit nen extra EventHandler versucht, und über diese EventTable, die ich noch nicht wirklich verstehe, Set EventHandler, SetNotify und Notify hatte ich aber aktiviert. Hilfe Pls.

    Guß Ryu


  • Mod

    Dein Timer sollte schon einen TimerEvent haben. Und der Timer ist eigentlich überflüssig.
    Schau dir am besten mal das Socketbeispiel unter samples/sockets an.

    phlox



  • Welche Samples jetzt?
    gibt es hier im Forum welche?
    Wenn ich danach google finde ich immer nur Beschreibungen zu Samples, ohne den Code.


  • Mod

    In deinem wx Verzeichnis: %wxdir%/samples/



  • Hallo,

    wxSocketBase wurde erst kürzlich in wxWidgets überarbeitet, rewrite.
    Ein Punkt war eine falsch arbeitende "IsData"-Function und viele weitere Probleme.

    Um das Problem in deinem Fall zu lösen, mußt du einen großen Buffer angeben und die entsprechende Größe, z.b. 65536 übergeben. Dann kriegst du mit LastCount() die Anzahl, die tatsächlich in den Buffer geschrieben wurde.



  • meinst du dann sowas wie

    do{
      memset(buf,'\0', 5);
      Socket->Read(buf, 4);
      Buffer.append(buf);
    }while(Socket->LastCount() != 0);
    

    kann man das machen? Nen read wenn auf dem Socket gar nichts drauf steht?



  • Wie es scheint hast du verschiedene Probleme mit wxWidgets (andere Posts).
    Kannst dich gerne bei mir per ICQ melden.

    Ryu1991 schrieb:

    kann man das machen? Nen read wenn auf dem Socket gar nichts drauf steht?

    Es gibt unterschiedliche Socket-Operations-Arten in wxWidgets.
    Schau dir mal "SetFlags" an.
    Deine Polling-Methode würde nur mit "nicht-blockenden" Sockets funktionieren.

    Aber es gibt programmtechnisch keine Garantie wann welche Pakete eintreffen und wie sie gesplittet werden ( Paketfragmentierung ).

    Je nach Umsetzung hat man dann ein Programmverhalten, das manche als Bug bezeichnen würden.


Anmelden zum Antworten