[wxWidgets] Großes Problem mit wxTimer und recv()



  • Hallo liebe Community,

    Bin grad dabei einen Chat zu schreiben (Client, Server) es funktioniert auch alles soweit bis auf das, wenn der Client daten empfängt (in einem Timer geregelt der jede Sekunde refresht) geht das einmal gut und dann hängt sich das Programm auf!
    Ich hab inzwischen schon soviel versucht und es klappt einfach nicht! Wäre super wenn ihr mir helfen könntet.

    Timer sieht so im Moment aus

    void Gui_MainFrame::OnTimer(wxTimerEvent &event)
    {
    		string msg;
    		wxString ausgabe;
    		client->clientrecv(msg);
    		ausgabe = wxString(msg.c_str(),wxConvLibc);
    		m_textCtrl9->AppendText(ausgabe);
    }
    

    die clientrecv() dazu

    int Socket::clientrecv(string& string) const
    {
        fd_set rfds,zero;
    	struct timeval tv;
    	tv.tv_sec=1;
    	int lese_sock = get_m_sock();
        FD_ZERO(&zero);
        FD_ZERO(&rfds);
        FD_SET(lese_sock,&rfds);
        select(lese_sock+1,&rfds,NULL,NULL,&tv);
        if(FD_ISSET(lese_sock,&rfds)>0)
        {
            return recv(string);
        }
        string = "";
        return 0;
    }
    

    die recv Funktion ist nicht die Orginale aus der Winsock.h sonder eine selber geschriebenen, die die Orginale benutzt aber in der stimmt alles!

    Bedanke mich schonmal im Vorraus

    mfg Stroker


  • Mod

    Schon mal überlegt wxSocket zu nutzen?



  • Danke für die Antwort. Liegt es daran?


  • Mod

    Stroker schrieb:

    Danke für die Antwort. Liegt es daran?

    Ka, was du da mit recv im hintergrund tust, und wieso das ganze sich Aufhängt.
    Aber der wxWidgets code kanns eigenelich nicht sein. Kommentier einfach mal den Aufruf von clientrecv aus,
    und schau ob der fehler immer noch existiert.

    Und wxSocket hat für solche Dinge eigene Events, damit bräuchtest du deinen Timer nicht. Dann bekommst du jeweils einen Event, wenn eine Message vom Server kommt.

    http://wxforum.shadonet.com/viewtopic.php?t=2736

    phlox



  • Problem gefunden und gelöst! Das Problem war der Timeout von select() hab tv_sec und tv_usec jetzt auf 0 gesetzt und es funktioniert prima 😃
    Trotzdem danke!!!

    Stroker


Anmelden zum Antworten