wxSockets Problem



  • Hallo,

    habe ein Problem mit wxSockets und komme nicht mehr weiter ohne hilfe...
    Habe mir auch schon dieses tut durchgelesen und daraus auch teile übernommen
    http://wxforum.shadonet.com/viewtopic.php?t=2736

    Habe mir damit und aus anderen Quellen eine mysocket Klasse erstellt die bisher so aussieht:

    #include "mySocket.h"
    
    mySocket::mySocket()
    {
    }
    
    mySocket::~mySocket(){}
    
    wxMessageDialog* WxMessageDialog_Port_fehler;  
    
    wxSocketServer* mySocket::CreateServerSocket (int nPort){
    
        wxIPV4address addr;
        if(!addr.Service(nPort))
            return NULL;
    
        wxSocketServer* ServerSocket = new wxSocketServer(addr);
    
        if (!ServerSocket->Ok())
        {
    
            if (ServerSocket->LastError() == wxSOCKET_INVPORT)
                   WxMessageDialog_Port_fehler =  new wxMessageDialog(NULL, wxT("Port in use"), wxT("Fehler"));
                   WxMessageDialog_Port_fehler->ShowModal();
    
            ServerSocket->Destroy();
            return NULL;
        }
    
        return ServerSocket; 
    
    }
    
    wxSocketClient* mySocket::CreateClientSocket(int port, wxString ipaddr){
    
        wxIPV4address  addr;
        wxSocketClient *client;
    
        addr.Hostname(ipaddr);
        if(!addr.Service(port))
            return NULL;
    
        client=new wxSocketClient();
    
        return client;
    
    }
    
    wxString* mySocket::read_Server(wxSocketServer* server){
    
         wxChar* msg= new wxChar[256];
         size_t len  = (wxStrlen(msg) + 1) * sizeof(wxChar);
         wxSocketBase* socket = server->Accept(false);
         //socket->WaitForRead(2);
         if(socket->IsData()){
                              socket->ReadMsg(msg, len);
         }
         wxString* data=new wxString(msg,256);
         return data;
    }
    
    void mySocket::write_Client(wxSocketClient* client, wxString msg){
    
         size_t len=(wxStrlen(msg)+1)*sizeof(wxChar);
         client->WriteMsg(msg, len);
    }
    

    testen wollte ich das ganze in einem dialog fenster wo ich eine eingabe mache und diese mir dann in einem textfeld wieder ausgeben lasse. sieht so aus...

    ...
    void wxsocket_testDlg::WxButton1Click(wxCommandEvent& event)
    {
    	wxSocketClient* test1;
    	wxString eingabedata;
    	mySocket* m_socket2=new mySocket();
    	test1=m_socket2->CreateClientSocket(12345, "127.0.0.1");
    	eingabedata=eingabe->GetValue();
    	m_socket2->write_Client(test1, eingabedata);
    
    	wxSocketServer* test;
            wxString* testdata; 
    	mySocket* m_socket=new mySocket();
    	test=m_socket->CreateServerSocket(12345);
    	testdata=m_socket->read_Server(test);
    	ausgabe->SetLabel(*testdata);
    
    }
    ...
    

    compiliert wird Fehlerfrei und starten tut der Dialog auch, nur wenn ich auf den Button clicke passiert ein paar Sekunden nichts und dann meldet sich Windows ".... Problem festgestellt und muss beendet werden..."

    Für tips und Hinweise wär ich Dankbar!


  • Mod

    Hm, rufst du irgendwo wxSocketBase::Initialize(); auf?



  • nein...


  • Mod

    Dann solltest du das. Dies Initialisiert die wxSockets. Ohne dies kann es zu Problemen kommen.

    Desweiteren kann dein Code so nicht funktionieren, evtl. hilft es server und client in 2 programme zu trennen.
    Der Client kann jedenfalls solange nix senden, bis auch ein Server auf den Port horcht.
    Schau dir mal das Socketbeispiel unter %wxdir%/samples/sockets an.



  • phlox81 schrieb:

    Hm, rufst du irgendwo wxSocketBase::Initialize(); auf?

    hmm. entweder bin ich blind oder zu d**f 😕
    finde das nicht
    http://www.wxwidgets.org/manuals/2.6/wx_wxsocketbase.html#wxsocketbase

    Ansonsten werde ich es mal versuchen mit zwei Programmen und mir mal die Beispiele anschauen.

    Danke & Gruß


  • Mod

    Hm, die Funktion ist leider auch in wx2.8.0 immer noch nicht dokumentiert, aber auch schon in 2.6 findet sich
    der Hinweis in dem obersten Absatz:

    Note: (Workaround for implementation limitation for wxWidgets up to 2.5.x) If you want to use sockets or derived classes such as wxFTP in a secondary thread, call wxSocketBase::Initialize() (undocumented) from the main thread before creating any sockets - in wxApp::OnInit for example. See http://wiki.wxwidgets.org/wiki.pl?WxSocket or http://www.litwindow.com/knowhow/knowhow.html for more details.



  • funktioniert leider auch mit zwei seperaten Programmen so nicht.
    Werde denk ich den sample Server und Client nehmen und meinen Bedürfnissen versuchen anzupassen. Da wird ja auch gleich mit events gearbeitet, was denk ich sowieso besser ist.

    Trotzdem Danke für deine Hilfestellung.


Log in to reply