CAsyncSocket-Problem



  • Hi.
    Vom Online-Kurs "C++ in 21 Tagen" habe ich die Lektion "Internet und Netzwerke" durchgearbeitet. (Siehe http://www.mut.de/media_remote/buecher/VCPLUS6/data/kap20.htm )

    Das ist eine Anleitung, wie man ein kleines Tool erstellt, welches wahlweise als Client oder als Server arbeitet. So leite ich also eine neue Klasse von CAsyncSocket ab, um dort die Nachrichten / Ereignisse abzufangen.

    m_send
    

    und

    m_listen[code] sind Instanzen dieser eigenen, abgeleiteten Socket-Klasse. Reaktionen auf die Nachrichten sind :
    
    OnConnect :[code]
    if (client)
            {
            m_send.Create();
            m_send.Connect(m_adress,m_port);
        }
        else
        {
            m_listen.Create(m_port);
            m_listen.Listen();
        }
    

    OnAccept :

    m_listen.Accept(m_send);
    

    OnSend :

    result=m_send.Send(LPCTSTR(m_msg), m_length);
    

    OnRecieve:

    result=m_send.Receive(pBuffer,m_length);
    

    OnClose :

    m_send.Close();
    

    Das Ganze lässt sich wunderbar kompilieren und linken - nur - es passiert nichts. Wenn ich zwei Instanzen des Programms starte, eines als Server, das andere als Client fungieren lasse, passiert gar nichts. Man sieht es ja an der Firewall, wenn eine Anwendung raus will, aber auch ganz ohne Firewall passiert nichts. (Ich kann mich auch daran erinnern, mir mal Client/Server-Demos von Delphi angesehen zu haben, wo auch nichts passierte)

    Kann das ein grundlegendes Problem sein -
    Habe ich das falsche Betriebssystem (Win2K) oder irgendwelche Komponenten nicht registriert ?



  • an win2k liegt es jedenfalls nicht, ud komponenten auch nicht.wahrscheinlich eher am code.nur noch so nebenbei: visual c++ in 21 tagen ist der größte schrott den ich jemals an programmmierbüchern gelesen habe.



  • Sorry, Schreibfehler :
    Bei der Nachricht "OnConnect" passiert gar nichts, stattdessen wird dieser Code durch den Knopfdruck "Senden" abgearbeitet.



  • versuch doch erstmal die messasges abzufangen was überhaupt passiert .! 🙂

    OnAccept :

    m_listen.Accept(m_send);

    OnSend :
    result=m_send.Send(LPCTSTR(m_msg), m_length);

    OnRecieve:
    result=m_send.Receive(pBuffer,m_length);

    OnClose :
    m_send.Close();

    void CDeinSocket::OnAccept(int nErrorCode) //natürlich auch für OnReceive usw.
    {
    //gibt es ein Fehler in der Verbindung? .. *** damit kannst du es auswerten ***
    if (nErrorCode == 0)
    // nun rufst du deine Dlg Accept() Funktion auf !..
    ((CDeinDlg*)m_pWnd)->OnAccept();

    mfg bambi
    ------------------------------------------------------
    it's not a bug , it's a feature



  • gleich noch was 🙂 ..

    if (client)
    //was ist client ? deklaration aber wie ?* du fragst hier nicht ab , welchen wert client hat!!!! ****
    {
    m_send.Create();
    m_send.Connect(m_adress,m_port);
    }
    else
    {
    m_listen.Create(m_port);
    m_listen.Listen();
    }

    mach aus client nen bool . dann sagts du
    if(client == true)
    {
    //dein code für client
    }
    else
    {
    //dein code für den server
    }

    hoffe das hilft dir 🙂



  • Moin,
    kommt mir irgendwie bekannt vor das problem 😃
    ich vermute du hast in deiner CAsyncSocket-Klasse etwas code vergessen:

    void CMySocket::OnAccept(int nErrorCode)
    {
        // Sind Fehler aufgetreten?
        if (nErrorCode == 0)
            // Nein, OnAccept-Funktion des Dialogfelds aufrufen
            ((CSockDlg*)m_pWnd)->OnAccept();
    }
    

    dieser code muss in alle Funktionen deiner CAsyncSocket-Klasse:
    virtual void OnSend(int nErrorCode);
    virtual void OnReceive(int nErrorCode);
    virtual void OnClose(int nErrorCode);
    virtual void OnConnect(int nErrorCode);
    virtual void OnAccept(int nErrorCode);

    '((CSockDlg*)m_pWnd)->OnAccept();' OnAccept je nach Funktion umändern also in 'OnClose()' '(CSockDlg*)m_pWnd)->OnClose();'

    kenne aber mehrere leute, die das gleiche problem hatten 😉


Anmelden zum Antworten