wxSocketBase in Container speichern



  • Hallo, ich habe noch nicht allzu viel Erfahrung mit wxWidgets, benutze den VC++ Express Compiler und brauche Hilfe bei folgendem Problem.
    Ich möchte ein kleines Netzwerkprogramm machen, das ungefähr so aufgebaut sein soll:
    •Es gibt einen Server, der auf Verbindungen von Clients wartet.
    •Ein Client verschickt eine Nachricht, die der Server empfängt.
    •Der Server verschickt die Nachricht weiter an alle anderen Clients.

    Die ersten beiden Punkte sind ja kein Problem - ich initialisiere ein Frame, mache Menupunkte zum Verbinden, mache ein OnServerEvent(wxSocketBase &event) durch EVT_SOCKET, bei dem dann die Verbindung angenommen wird, und so weiter ...
    OnServerEvent ist so aufgebaut (überwiegend aus den Samples übernommen und gekürzt, um hier nicht zu viel Platz zu verbrauchen):

    void MyFrame::OnServerEvent(wxSocketEvent& event)
    {
    	wxSocketBase *sock;
    
    	sock = m_server->Accept(false);
    
    	if(sock)
    	{
    		m_text->AppendText(wxT("Neue Verbindung aufgenommen\n"));
    	}
    	else
    	{
    		m_text->AppendText(wxT("Fehler: Es konnte keine neue Verbindung neu angenommen werden\n"));
    		return;
    	}
    
    	sock->SetEventHandler(*this, SOCKET_ID);
    	sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
    	sock->Notify(true);
    
    	m_numClients++;
    }
    

    Wie kann ich jetzt diese Methode mit der besten Möglichkeit so erweitern, dass *wxSocketBase sock gespeichert wird, zum Beispiel mit einer Liste, einem Array, HashMap, ... ?

    Dabei möchte ich sagen, dass ich bereits die Dokumentation zu den Containern wxHashMap und wxArray auf wxwidgets.org bereits gelesen habe, aber anscheinend nicht richtig verstanden habe, also wäre ich dankbar für eine kurze Erklärung dazu.


  • Mod

    Prinzipiell würde ich von den wxContainern abraten, da sie leider nicht STL konform sind,
    und auch recht makro lastig sind. Ein std::vector<wxSocketBase*> sollte aber klappen.

    phlox



  • Danke für die schnelle Antwort - es funktioniert alles ohne Probleme 🙂



  • Hallo,

    habe das selbe Problem. Könntest du evtl den angepassten Code posten...

    Bei mir sieht es so aus:

    {
      wxString s = _("OnServerEvent: ");
      std::vector<wxSocketBase*> sock;
    
      switch(event.GetSocketEvent())
      {
        case wxSOCKET_CONNECTION : s.Append(_("wxSOCKET_CONNECTION\n")); break;
        default                  : s.Append(_("Unexpected event !\n")); break;
      }
    
      SetStatusText(s, 1);
    
      sock[m_numClients]=m_server->Accept(false);
    
      if (sock[m_numClients])
      {
        SetStatusText("New client connection accepted", 1);
      }
      else
      {
        SetStatusText("Error: couldn't accept a new connection", 1);
        return;
      }
    
      sock[m_numClients]->SetEventHandler(*this, SOCKET_ID);
      sock[m_numClients]->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
      sock[m_numClients]->Notify(true);
    
      //m_numClients++;
      UpdateStatusBar();
    }
    

    kompiliert wird auch ohne Fehler, nur sobald eine Verbindung reinkommt, stürzt das Programm ab "... Fehlerverursacht und muss beendet werde..."
    Hoffe du liest das hier noch.
    Danke & Gruß


  • Mod

    Hm, so gehts nicht.
    Du musst dem Vector natürlich das entsprechende wxSocket Element vorher hinzufügen.
    Ausserdem sollte der Vector nicht lokal in der Funktion/Methode sein.



  • Ausserdem sollte der Vector nicht lokal in der Funktion/Methode sein.

    Das ist klar, war nur schnell zum testen.

    Du musst dem Vector natürlich das entsprechende wxSocket Element vorher hinzufügen.

    verstehe nicht was du meinst.

    Das Objekt wird doch erst bei accept erstellt, also hier

    sock[m_numClients]=m_server->Accept(false);
    

    oder was meinst du?

    Danke & Gruß



  • Du musst dem Vector natürlich das entsprechende wxSocket Element vorher hinzufügen.

    so vielleicht:

    sock.assign(m_server->Accept(false));
    

  • Mod

    Erstmal verstehen wie std::vector funktioniert 😉

    Mit dem op[] könntest du höchstens schon exsitierende Objekte überschreiben.
    Um ein Objekt in den Vector einzufügen müsstest du push_back verwenden:

    wxSocket* s = server->Accept(false);
    if(s != NULL)
    myvec.push_back(s);
    


  • Ok. Funktioniert auch. Habe es aber inzwischen über eine std::map gelöst, gefällt mir besser. Danke.


Anmelden zum Antworten