Client->Verbindung an Server via CAsyncSocket



  • Hallo

    Ich will eigentlich ein IRC BOT (Internet Relay Chat) oder auch mIRC oder gIRC und was es nicht alles gibt, schreiben.

    Ich will nix besonderes, wollte es nur mal ausprobiern, bis jetzt hab ich es geschaft ohne der copy und past Methode zu arbeiten 😃 , aber ich glaub das was ich gemacht hab ist auch nicht besonders viel oder schwer, nunja hier ist mein 1 Versuch

    void CMuuknusIRCbotDlg::OnButtonConnect() 
    {
    
    	CAsyncSocket MySocket;
    	MySocket.Create();
    	MySocket.Connect(m_Server,6667); //6667 ist der Standard Port für IRC
    	MySocket.AsyncSelect(FD_CONNECT);
    	MySocket.Close();
    
    }
    

    Wie Ihr sehen könnt heißt mein Bot Muuknus, und wie Ihr auch sehen könnt mach ich das ganze über nen Button der Connect heißt, nun ein Socket hab ich schonmal geschaft, glaub ich zumindest, was mir fehlt ist eigentlich das connecten, ich bin mir nicht sicher ob FD_CONNECT das macht, nun ja also meine Frage: Ist das was ich bis jetzt gemacht hab ausreichend um zu einem Server zu connecten, oder ist das noch ne ganze Ecke weit weg?

    thx for comments :p



  • Überschreib OnConnect in deiner Klasse und guck ob es aufgerufen wird. 🙂



  • Also,

    Hab jetzt folgendes gemacht

    MySocket.OnConnect();

    kenn keinen passenden Parameter, was soll da rein? eine 0 oder so ein Error Code?

    Ok hab was gefunden

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

    habs aber so umgesetzt

    void CMuuknusIRCbotDlg::OnButtonConnect() 
    {
    
    	CAsyncSocket MySocket;
    	MySocket.Create();
    	MySocket.Connect(m_Server,6667);
    	MySocket.AsyncSelect(FD_CONNECT);
    	MySocket.OnConnect(int nErrorCode)
    		if(nErrorCode == 0)
    		{
    			MessageBox("Keine fehler!");
    		}
    		else
    		{
    			MessageBox("Toll! ein Fehler!");
    		}
    	MySocket.Close();
    
    }
    

    Geht aber nicht, da sind 5 Fehler aufgetreten 😞



  • Du sollst die OnConnect Memberfunktion nicht selbst aufrufen. Das sollte automatisch passieren. Setz das AsyncSelect(FD_CONNECT) vorsichthalber vor den Connect Aufruf. Und nimm das Close raus, sonst wird der Socket unter Umständen geschlossen, bevor eine Verbindung aufgebaut werden kann.



  • Wie meinste das?

    so oder wie?

    void CMuuknusIRCbotDlg::OnButtonConnect() 
    { 
        CAsyncSocket MySocket; 
        MySocket.Create();
    	MySocket.AsyncSelect(FD_CONNECT);
        MySocket.Connect(m_Server,6667);
    }
    

    Wie kann ich es testen ob die Verbindung steht?
    thx for Help



  • Wenn die Verbindung steht wird dein OnConnect aufgerufen.

    Aber ich glaube es gibt noch ein Problem: Der Destruktor von CAsyncSocket ruft wahrscheinlich auch Close auf. Das heißt wenn Connect nicht sofort die Verbindung aufgebauen kann (Rückgabewert: WSAEWOULDBLOCK), dann ist dein Socket wieder zu bevor er die Verbindung vollständig aufgebaut ist.

    Du müsstest wahrscheinlich den Socket einen Member deines Fensters machen.



  • Also MySocket soll ein member des MainWindows werden 😕

    Wie mach ich das ?



  • Also wenn du das wirklich nicht weißt, dann würd ich drigend abraten mit der Socket-Programmierung weiter zu machen.



  • Ich hab noch nie Socket programmierung gemacht.
    Ich kann bis jetzt nur

    Consolen, Dialog(Objektorientierte) programmierung
    dann hab ich noch Klassen gelernt..

    Ich wollt das mal ausprobiern, hab nie gesagt das ich das kann,
    Ich lese mir mal http://www.is-edu.hcmuns.edu.vn/BoMon/CNPM/LopCD/VC-21/ch20.htm#Heading2 durch.

    trozdem danke



  • Hi,

    ich hab auch mal den Drang gehabt einen IRC-Bot zu proggn (mit MFC).
    Habs auch gemacht, aber es ist nicht so einfach wie man es sich zuerst vorstellt.
    1. brauchst Du Grundlagen Netzwerkprogrammierung
    2. musst Du Dir RFC 1459 reinziehen

    Um eine Verbindung aufzubauen und zu halten musst Du z.B. einen Nick etc. an den Server übermitteln.
    Dann bekommst Du Pings vom Server, die Du per Pong beantworten musst usw.

    Mein Tip: Erstell Dir erstmal eigene Client/Server Anwendungen und schick ein Paar Strings hin und her.
    Lies Dir die RFC durch und mach dem entsprechend weiter...



  • Danke für die Tipps!

    Hab mir ein Tutorail angeguckt und es Schritt für Schritt anhand des Tutorials nach programmiert, ich habe das Prinziep schon verstanden, hab aber nicht daran gedacht das CAsyncSocket eine eigene Klasse braucht in der die memberfunktionen wie OnConnect .. oder der gleichen verwendet werden, ich dachte es ist eine Einzelne FUnktion die man nach lust und laune aufrufen kann, wie zum Beispiel so:

    Dies ist ein falscher Code ⚠

    CAsyncSocket MySocket;
    MySocket.Connect(Server,Port);
    ...
    

    fertig!

    Hab es mir wohl doch zueinfach gemacht 😞

    Ich hab keine Probleme mit Klassen, jetzt macht es mir sogar spaß Sockets zu machen 😃


Anmelden zum Antworten