[wxWidgets] wxSOCKET_INPUT wird bei ankommenden Daten nicht aufgerufen



  • Hallo wiedermal,

    diesmal ist es ein Problem mit meinem Server. Ich habe bereits einen Client programmiert, der erfolgreich Daten an localhost sendet, ich habe es bereits an einem anderen Programm getestet, was bestätigte, dass Daten ankommen. Jedoch klappt es bei meinem Code nicht:

    Zuvor die Eventtable:

    BEGIN_EVENT_TABLE(MeineKlasse, wxFrame)
    EVT_SOCKET (ID_SERVER, MeineKlasse::OnServerEvent)
    EVT_SOCKET (ID_SOCKET, MeineKlasse::OnSocketEvent)
    END_EVENT_TABLE()
    

    Im Ctor meiner Klasse habe ich erstmal den Serversocket erstellt. Die entsprechenden Klasseninstanzen wurden natürlich bereits deklariert.

    wxIPV4address data;
    data.Service (3000);
    Server = new wxSocketServer (data);
    
    Server->SetEventHandler (*this, ID_SERVER);
    Server->SetNotify (wxSOCKET_CONNECTION_FLAG);
    Server->Notify (true);
    

    Nun die Implementierung der OnServerEvent () - Funktion, die bei einer einkommenden Verbindung aufgerufen wird (ID_SERVER):

    void MeineKlasse :: OnServerEvent (wxSocketEvent &event)
    {
        wxSocketBase *Socket;
        switch (event.GetSocketEvent ())
        {
            case wxSOCKET_CONNECTION:
                //'EventBox' ist nur ein TextCtrl, die folgende Meldung wird noch angezeigt:
                EventBox->AppendText ("wxSOCKET_CONNECTION\n");
                break;
    
            default: ;
        }
    
        Socket = Server->Accept (false);
        // ...dieser Text wird ebenfalls noch angezeigt...
        if (Socket) EventBox->AppendText ("Neue Verbindung akzeptiert!\n");
    
        // Beim nächsten Event soll nun Funktion 'OnSocketEvent ()' aufgerufen werden, die dann die 
        // Dateneingänge handelt:
        Socket->SetEventHandler (*this, ID_SOCKET);
        Socket->SetNotify (wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
    
        Socket->Notify (true);
    }
    

    Ab jetzt müsste eigentlich jedes Event an die Funktion OnSocketEvent geleitet werden, da ja entsprechend umgestellt:

    void BasicFrame :: OnSocketEvent (wxSocketEvent &event)
    {
        // wxSocketBase *Socket = event.GetSocket();
        switch (event.GetSocketEvent ())
        {
            wxSOCKET_INPUT:
                // Das hier wird trotz Dateneingang niemals angezeigt!
                EventBox->AppendText ("Datenpaket empfangen...\n");
                break;
    
            wxSOCKET_LOST:
                // Auch nicht!
                EventBox->AppendText ("Verbindung verloren!\n");
                break;
    
            default: ;
        }
    }
    

    Liegt wohl die Vermutung nahe, dass die Events garnicht zu dieser Funktion umgeleitet werden. An was kann's liegen?

    Danke schonmal für die Hilfe mikey.


  • Mod

    Hast du dir schon das wxSocket Beispiel unter %wxWin%/samples/ angesehen?



  • Hi,

    ich habe es jetzt endlich hinbekommen. Ich muss beim wxSOCKET_INPUT die Daten der Eventschleife mit wxSocketBase::Discard () löschen, damit klappt es wunderbar, und wxSOCKET_INPUT wird bei erneut ankommenden Daten wie gewohnt aufgerufen. 🙂

    Mfg mikey.



  • Hallo,
    ich weiß, dieser Post ist relativ alt, allerdings habe ich gerade erst mit Netzwerk unter wxWidgets richtig erfahrung gesammelt und häng jetzt genau beim gleichen Problem. Ich hab auch schon versucht den Befehl wxSocketBase::Discard() sinnvoll einzubauen, allerdings klappt das bei mir nicht so richtig.
    @mikey: Kannst du mir vielleicht ein kurzes Code-Schnippselchen zeigen, damit ich den richtigen Weg finde? (Soweit du nach über einem Jahr den Code evtl. noch hast)


Anmelden zum Antworten