ChatClient IRC



  • Hi @all,

    ich möchte ein Chatprogramm schreiben. Bin dabei noch ziemlich am Anfang.
    Mach mir halt gerade so meine Gedanken darüber. 🙄
    Jetzt hab ich mir gedacht, wenn schon, denn schon.
    Also, folgendes will ich bewerkstelligen.
    Im Client soll eine Auswahl von verschiedenen Chaträumen sein (In einer ComboBox z.B. Raum C++ User 4/20). Wenn ein Eintrag ausgewählt wurde und die erlaubte Menge von 20 Usern noch nicht erreicht ist, soll er auf Knopfdruck eintreten.
    Dann hat er 1 Feld zum Lesen, 1 Feld für die User im Raum und 1 Feld zum Schreiben.

    Als Server wollte ich allerdings nur einen laufen lassen, und darüber alle Chaträume steuern. Er soll natürlich immer den aktuellen Status haben, wer in welchen Raum ist und bei einer Änderung alle informieren (so das sich im Client in der Combobox der Status ändert).
    Ist das überhaupt möglich oder kann eine Socketverbindung immer nur auf einen Port hören?
    Kennt einer ein Tutorial, welches in die Richtung geht. (Bitte nicht Tag 20 aus: "Jetzt lerne ich c++").



  • Hi

    klar gehts das 😉
    Der Server verwaltet eine Liste mit allen IPs (und natürlich allen offenen Ports) und schickt eine "Update-Nachricht" (mit allen erforderlichen Informationen) an alle Clients, sobald sich etwas relevantes ändert.

    Als Einstieg würde ich dir empfehlen einfach mal die relevanten Klassen in der MSDN durchpauken 😃

    Grüße Rapha



  • Hi Rapha,

    ich hab gehört, das man für sowas lieber irc einbinden sollte. Hast Du sowas schon mal gemacht, oder weißt wo sowas steht?



  • Kommt ganz drauf an, was du machen willst.
    IRC ist ein bereits fertiges Chat-Protokoll (d.h. es steht fest, was die Clients den Server "fragen" sollen und auf welche Weise dieser antworten soll).

    Wenn du einen IRC-Clienten (also ein Programm, mit dem du mit einem IRC-Server kommunizieren willst wie z.b. mIRC) oder einen IRC-Server (ein Programm, dass eventuelle Anfragen der IRC Clienten annimmt) schreiben willst, musst du dich an das sogenannte IRC-Protokoll halten (also die Form, mit der Server und Client miteinander kommunizieren [z.B. muss der Client auf eine "ping"-Nachricht des Servers mit einem "pong"-Antworten, um dem Server zu signalisieren, das er noch da ist]). Schau dir in diesem Fall einfach mal das IRC-Protokoll an: http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc1459.html oder http://www.irchelp.org/irchelp/rfc/rfc.html

    Was genau willst du denn für ein Chatprogramm schreiben?

    Grüße Rapha



  • Ich möchte eine Chatfunktion, in der der Client einen Chatroom aussuchen und (wenn noch nicht voll max. 50 User) eintreten kann. Ist der Raum voll, soll er auf einen anderen Chatroom ausweichen. In die Chaträume kann man aber nur mit meinem Programm.
    Zumindest stelle ich mir das so vor 😉



  • Das macht es natürlich um einiges leichter 😉

    Das funktioniert folgendermaßen der Client und der Server schicken sich (z.B. mit der Klasse CSocket) Zeichenketten hin und her, die der jeweils andere auswertet.
    z.B. könnte ein solches Gespräch 😃 folgendermaßen aussehen(C = Client S = Server):

    C: NAME "Raphael"
    S: OK
    S: CHATTRÄUME {("Computerspiele", 8), ("C++", 9)}
    *Anmerkung: ich habs mir so gedacht: immer "("+ Chatroomname+ ","+Anzahl der User im Chatroom + ")"*
    C: WÄHLE_CHATRAUM "C++"
    S: OK
    C: WELCHE_CHATTER_SIND_ONLINE
    S: CHATTER_ONLINE "Raphael|Trikor|Raphael_original|Trikor_original"
    C: MSG_TO "Trikor" "Tolles Protokoll, oder?"

    Ist nur ein spontanes Beispiel von mir. Wie die Unterhaltung 😃 aussieht, musst du dir selber überlegen 😉 (als Anregung kannst du dir ja mal die Mailprotokolle SMTP und POP3 anschauen).

    Grüße Rapha



  • Hi Rapha,

    das ganze wird wohl doch über IRC gehen.
    Hab da auch ne echt starke Seite gefunden. Die lohnt sich wirklich
    http://www.irc-mania.de/index.php

    Seh ich das richtig, das ich quali eine ganz normale Socketverbindung mit nen IRC-Server aufbaue und dann die Daten über Strings übergebe.

    z.B.
    USER IRC_USER 0 0: Realname
    NICK Trikor
    JOIN #Trikorchat
    Privmsg #Trikorchat Hallo leute

    und dann über m_sMySocket.Listen() die Strings entgegennehme um die Nachrichten der anderen Chatter in meinem Editfeld zu schreiben?



  • 100%ig richtig 👍
    Ich denke es gibt einige vorgefertigte IRC-Klassen, schau dich da mal um.

    Grüße Rapha



  • Wo???????



  • z.B. hier: http://www.codeguru.com/network/irc.html

    Grüße Rapha



  • Hi Rapha,

    die Klasse ist nicht ohne. Ich sitz jetzt schon seit Stunden, wie der Ochs form Berg und versuche mich in den Klassen einzulesen.
    Wenn ich das richtig sehe, werden in

    bool CIrcSession::Connect(const CIrcSessionInfo& info)
    

    die Daten für die Connection übergeben. Deshalb wollte ich eine protected Variable vom Typ const CIrcSessionInfo& namens m_ircAnmeldung anlegen.
    Dann m_ircAnmeldung füllen

    m_ircAnmeldung.sServer = "nexgo.de.eu.dat.net";
    m_ircAnmeldung.iPort = 7000;
    // usw.
    

    und anschließen aufrufen

    CIrcSession::Connect(m_ircAnmeldung);
    

    Mein Programm erkennt aber anscheinened const CIrcSessionInfo& obwohl ich irc.h in meine CHauptDlg.h includiert habe.
    Was mach ich falsch?



  • Nene, das & ist eine Refferenz 😉
    Einfach eine Variable vom Typ CIrcSessionInfo erstellen (kann temorär sein) und als Parameter übergeben ( angenommen m_Session ist eine Variable vom Typ CIrcSession:

    CIrcSessionInfo SessionInfo;
    /* SessionInfo hier mit Werten füllen */
    m_Session.Connect(SessionInfo);
    

    Grüße Rapha



  • CIrcSessionInfo SessionInfo;
    

    Hab ich auch schon probiert. Da sagt er mir immer nichtdeklarierter Bezeichner.
    Die CIrcSessionInfo ist ne struct in irc.h
    Und die irc.h habe ich in meiner CHauptDlg.h schon includiert.
    Warum funktioniert das nicht?



  • Haste mal alles bereinigt und alles neu erstellt?
    Ansonsten musst du irgendwas übersehen haben.

    Grüße Rapha



  • Alles bereinigt, fehler beibt. Vieleicht siehst Du ihn ja. Ich seh schon den Wald vor lauter Bäumen nicht.

    Meine Hauptdlg.h

    //{{AFX_INCLUDES()
    #include "mediaplayer2.h"
    #include "wmpplayer5.h"
    #include "irc.h"
    #include "MD5Checksum.h"
    #include "xShadeButton.h"
    //}}AFX_INCLUDES
    ...
    
    class CHauptDlg : public CDialog
    {
    // Konstruktion
    public:
    	CIrcSession m_Session;   //wird nicht erkannt
    	void SetChatLogin();
    	void Groessenanpassung();
    	CWnd* pMedia;
    	CWnd* pBild;
    	BOOL MsgSenden(CString Msg, BOOL Ok_Abbruch);
    	CStringArray m_strChannel;
    	CString m_strPasswortV;
    	CString m_strAnmeldung;
    	CString GetHttpSource(CString URL);
    	CHauptDlg(CWnd* pParent = NULL);	// Standard-Konstruktor
    

    Die irc.h

    #include "socket.h"
    #include "HauptDlg.h"
    #include <string>
    #include <vector>
    #include <map>
    #include <set>
    #include "CrossThreadsMessagingDevice.h"
    ...
    struct CIrcSessionInfo
    {
    	String sServer;
    	String sServerName;
    	unsigned int iPort;
    	String sNick;
    	String sUserID;
    	String sFullName;
    	String sPassword;
    	bool bIdentServer;
    	String sIdentServerType;
    	unsigned int iIdentServerPort;
    
    	CIrcSessionInfo();
    	CIrcSessionInfo(const CIrcSessionInfo& si);
    
    	void Reset();
    };
    
    ////////////////////////////////////////////////////////////////////
    
    class CIrcDefaultMonitor; // foreward
    
    class CIrcSession
    {
    public :
    	friend class CIrcDefaultMonitor;
    
    	CIrcSession(IIrcSessionMonitor* pMonitor = NULL);
    	virtual ~CIrcSession();
    //    usw.
    

    Da er ja auch CIrcSession m_Session; in der HauptDlg.h nicht erkennt, muß irgendwas beim includieren schief gehen. Aber was???



  • Kann es sein, dass ich die Klasse nicht benutzen kann, weil die Klasse für eine MDI-Anwendung geschrieben wurde?
    Mein Programm ist Dialogfeldbasierend.



  • Huhu !

    Probier mal diese Zeile in deiner Hauptdlg.h: using namespace irc;

    Gruss, Joe



  • Joe schrieb:

    Probier mal diese Zeile in deiner Hauptdlg.h: using namespace irc;

    Danke Joe, das war´s.

    Und dir natürlich auch, Rapha. 😃


Anmelden zum Antworten