Netzwerk Messenger



  • Hallo

    ich bin noch ein Anfänger in der Windowsprogrammierung und ich will einen Messenger für fas lokale Netzwerk programmieren. Also ich habe einen Server und mehrere Clients, was mir noch Probleme bereitet ist die Netzwerkkommunikation, mit der ich bisher noch keine Erfahrungen gemacht habe.

    Also ich habe mir das so vorgestellt:

    Der Server verwaltet die User indem er bei deren Anmeldung einen String mit der IP und dem username erhält und diese Informationen al alle anderen Clients sendet. Bei Nachrichten soll das ebenfalls auf diese Weise ablaufen.

    Bedenkt bei euren Vorschlägen bitte dass ich noch neu in der Windowsprogrammierung bin und zb mit den ganzen events noch nicht so vertraut bin.

    Ich würde mich über jede Nachricht freuen, die mit hilft das Projekt zu realisieren.



  • erstmal solltest du dir überlegen über welche schnitstelle(n) du das realisieren willst. willst du das ganze mit directX machen? (DirectPlay)
    oder lieber über sockets? (korrigiert mich bitte, wenn ich falsch liege, aber ich mein die 2te möglichkeit waren doch sockets oder? *gg*)

    Aber ich glaub, directX ist besser, da du ja in Zukunft auch sicher spiele schreiben willst, und die netzwerkkommunikation da besser über directX o.ä. laufen sollte 🙂

    cya



  • Also wenn du nur auf die Kommunikation im Netz wert legst, dann installiere doch auf deinem Server einen IRC-Server 👍 . Oder du installierst einen Webserver und erstellst eine Intranet-Site mit Forum als Kommunikationsebene. Sind nur zwei kleine Vorschläge, um ans Ziel zu gelangen. Es sei denn, dir liegt es mehr an dem Weg zum Ziel, sprich der Programmierung. Dann wünsch ich dir viel erfolg, denn ich hab keine Ahnung von Sockets etc. 😉

    cu bais



  • Soll das ein Chat werden? Oder einfach ein Programm, mit dem man kleine Messages verschicken kann, die dann beim Empfänger als Dialog aufpoppen? Schau dir zu Letzterem mal meine Programme NetSend und NetMail auf meiner Homepage (www.webfritzi.de.vu) an. Das eine Programm benutzt den Windows NT/XP/2000-Nachrichtendienst, und das zweite Programm (welches auch auf den anderen Win-Versionen läuft) benutzt MailSlots. Du kannst sowas natürlich auch über Sockets realisieren. Bei sowas bräuchtest du aber garkeinen zentralen Server. Das geht auch so ganz einfach.



  • Erstmal danke für eure Antworten
    Also ich habe mir das Programm so ähnlich wie ICQ vorgestellt, also dass man eine Liste hat, wer alles online ist und demjenigen Messages schreiben kann. Deshalb denke ich auch, dass das Verwalten der angemeldeten User mit einem Serverprogramm (kein extra server PC) so einfacher wäre. Das Programm soll in einem Schulnetzwerk laufen, also ich habe da leider keine Möglichkeit IRC o.ä. zu installieren und der Nachrichtendienst von Windows ist auch deaktiviert. Also Sockets wäre doch die beste Lösung dafür oder? Wo kann ich mir ein Paar Beispiele ansehen, wie man damit umgehen kann?

    elmo



  • elmo schrieb:

    Erstmal danke für eure Antworten
    Also ich habe mir das Programm so ähnlich wie ICQ vorgestellt, also dass man eine Liste hat, wer alles online ist und demjenigen Messages schreiben kann. Deshalb denke ich auch, dass das Verwalten der angemeldeten User mit einem Serverprogramm (kein extra server PC) so einfacher wäre.

    Du brauchst kein Extra-Programm dafür. Du kannst deinem Programm doch auch einen Thread hinzufügen, der ankommende Messages verarbeitet. So hab ich es jedenfalls gemacht. Und wenn du schnell ein Ergebnis erziehlen willst und nciht sooo die Lust hast, dich in die Socket-Programmierung reinzufriemeln, dann kann ich dir nur MailSlots empfehlen. Das sind sozusagen freigegebene Dateien auf den einzelnen Computern, die du auslesen und in die du schreiben kannst. Für mein Programm "NetMail" habe ich die folgenden Funktionen benutzt:

    DWORD WriteSlot(LPTSTR lpszSlotName, LPTSTR lpszTo,
                    LPTSTR lpszFrom, LPTSTR lpszFromNick,
                    LPTSTR lpszMessage)
    {
       BOOL fResult;
       HANDLE hFile;
       DWORD cbWritten;
       int buflen;
       LPTSTR lpszSlotPath, lpszSendString, lpszPtr;
    
       // Den Pfad aufbauen
       // Format: \[ComputerName]\mailslot\netmail
       buflen = lstrlen(lpszTo) + lstrlen(lpszSlotName) + lstrlen( TEXT("\\\\mailslot\\\\") ) + 1;
       lpszSlotPath = (LPTSTR)malloc(buflen);
       wsprintf(lpszSlotPath, "\\\\%s\\mailslot\\%s", lpszTo, lpszSlotName);
    
       // Den Pfad als File öffnen
       hFile = CreateFile(lpszSlotPath,
                          GENERIC_WRITE,
                          FILE_SHARE_READ,  // required to write to a mailslot
                          (LPSECURITY_ATTRIBUTES)NULL,
                          OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL,
                          (HANDLE)NULL);
    
       // Den Pfad freigeben
       free(lpszSlotPath);
    
       // CreateFile fehlgeschlagen
       if(hFile == INVALID_HANDLE_VALUE)
          return ERROR_NO_ACCESS;
    
       // Den SendString aufbauen
       // Format: "[FromComputerName]\0[FromNick]\0[ToComputerName]\0[Message]\0"
       buflen = lstrlen(lpszFrom) + lstrlen(lpszFromNick) +lstrlen(lpszTo) + lstrlen(lpszMessage) + 4;
       lpszSendString = (LPTSTR)malloc(buflen);
       wsprintf(lpszSendString, "%s", lpszFrom);
       lpszPtr = lpszSendString + lstrlen(lpszFrom) + 1;
       wsprintf(lpszPtr, "%s", lpszFromNick);
       lpszPtr = lpszPtr + lstrlen(lpszFromNick) + 1;
       wsprintf(lpszPtr, "%s", lpszTo);
       lpszPtr = lpszPtr + lstrlen(lpszTo) + 1;
       wsprintf(lpszPtr, "%s", lpszMessage);
    
       // Die Message senden (in das Pseudo-File schreiben)
       fResult = WriteFile(hFile,
                           lpszSendString,
                           buflen,  // include terminating null
                           &cbWritten,
                           (LPOVERLAPPED)NULL);
    
       // Den SendString freigeben
       free(lpszSendString);
    
       // WriteFile fehlgeschlagen
       if(!fResult)
          return ERROR_CANNOT_SEND;
    
       // Das File-Handle schließen
       CloseHandle(hFile);
    
       return FINE;
    }
    //---------------------------------------------------------------------------
    
    HANDLE CreateSlot(LPTSTR lpszLocalSlotName)
    {
       HANDLE hSlot;
    
       // Den MailSlot öffnen
       hSlot = CreateMailslot(lpszLocalSlotName,
                              0,                             // no maximum message size
                              MAILSLOT_WAIT_FOREVER,         // no time-out for operations
                              (LPSECURITY_ATTRIBUTES) NULL); // no security attributes
    
       // CreateMailSlot fehlgeschlagen
       if(hSlot == INVALID_HANDLE_VALUE)
          hSlot = NULL;
    
       return hSlot;
    }
    //---------------------------------------------------------------------------
    
    BOOL ReadSlot(HANDLE hSlot, HWND hwnd, INCOMING_MESSAGE_PROC MessageProc)
    {
        DWORD cbMessage = 0, cMessage = 0, cbRead = 0;
        BOOL fResult;
        LPTSTR lpszBuffer;
        HANDLE hEvent;
    
        hEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("ExampleSlot"));
        if(!hEvent)
           return FALSE;
    
        // Informationen über die erste Message bekommen
        fResult = GetMailslotInfo(hSlot,           // mailslot handle
                                  (LPDWORD)NULL,   // no maximum message size
                                  &cbMessage,      // size of next message
                                  &cMessage,       // number of messages
                                  (LPDWORD)NULL);  // no read time-out
    
        // GetMailSlotInfo fehlgeschlagen
        if(!fResult)
           return ERROR_CANNOT_READ_INFO;
    
        // Keine Nachrichten am Start
        if(cbMessage == MAILSLOT_NO_MESSAGE)
            return ERROR_NO_MESSAGES;
    
        while(cMessage != 0)  // retrieve all messages
        {
           // Allocate memory for the message.
           lpszBuffer = (LPTSTR)malloc(cbMessage);
           lpszBuffer[0] = '\0';
    
           // Aus dem Pseudo-File lesen
           fResult = ReadFile(hSlot,
                              lpszBuffer,
                              cbMessage,
                              &cbRead,
                              NULL);
    
           // ReadFile fehlgeschlagen
           if (!fResult)
           {
              free(lpszBuffer);
              return ERROR_CANNOT_READ_SLOT;
           }
    
           // Den Message-String an die Callback-Funktion weiterleiten
           MessageProc(lpszBuffer, hwnd);
           free(lpszBuffer);
    
           // Informationen über die nächste Message bekommen
           fResult = GetMailslotInfo(hSlot,          // mailslot handle
                                     (LPDWORD)NULL,  // no maximum message size
                                     &cbMessage,     // size of next message
                                     &cMessage,      // number of messages
                                     (LPDWORD)NULL); // no read time-out
    
            // GetMailSlotInfo fehlgeschlagen
            if(!fResult)
                return ERROR_CANNOT_READ_INFO;
        }
    
        CloseHandle(hEvent);
        return FINE;
    }
    //---------------------------------------------------------------------------
    
    BOOL IsMessageInQueue(HANDLE hSlot)
    {
        DWORD cbMessage = 0, cMessage = 0;
        BOOL fResult;
    
        // Informationen über die erste Message bekommen
        fResult = GetMailslotInfo(hSlot,           // mailslot handle
                                  (LPDWORD)NULL,   // no maximum message size
                                  &cbMessage,      // size of next message
                                  &cMessage,       // number of messages
                                  (LPDWORD)NULL);  // no read time-out
    
        // GetMailSlotInfo fehlgeschlagen
        if(!fResult)
           return FALSE;
    
        // Keine Nachrichten am Start
        return (cbMessage == MAILSLOT_NO_MESSAGE) ? FALSE : TRUE;
    }
    //---------------------------------------------------------------------------
    


  • Hallo

    Ich hab eine Frage zum Mailslot.

    Ich will ein Chat-Prog schreiben. In C und die Ausgabe/Eingabe soll nur in einer Konsole passieren. Am Anfang wird der name des Mailslots als Parameter übergeben. Aber das Programm soll nicht blockieren wenn ein Readfile gemacht wird dafür soll ein overlapped objekt benutzt werden (Ich weiß aber nicht wie man das benutzt)

    Das Programm soll ankommende Nachrichten anzeigen, während ich noch eine Nachricht schreibe. (Wo meine noch nicht abgeschickte Nachricht steht ist erstmal egal, am besten wärs aber wenn sie immer ganz unten steht oder unter der letzten angekommenen nachricht)

    Ich hab schon zwei Teilprogramme eins zum lesen und ein zum schreiben, aber beides muß in ein Programm rein (mit Threads z.B)???

    kann mir jemand helfen? Ich könnte bei bedarf auch den Quelltext posten den ich bis jetzt hab, aber das würde jetzt erstmal den Rahmen sprengen. Es sieht fast genauso aus wie bei WebFritzi

    mfg
    Ra



  • Hi!

    Schau dir doch, falls dir das vorerst was hilft, als tutorial das hier an:

    http://www.zfx.info/Tutorials.php?ID=84

    ist zwar nur nen chatclient in der win32 - konsole, aber das kannst dann schnell als win32 anwendung umgestalten (will heißen, mit schönen fensterchen usw.)

    cya und frohe weihnachten noch :xmas1:



  • also oft versteh ich euch nicht.

    auf die aussage hin das er "ich bin noch ein Anfänger in der Windowsprogrammierung und ich will einen Messenger für fas lokale Netzwerk programmieren. Also ich habe einen Server und mehrere Clients, was mir noch Probleme bereitet ist die Netzwerkkommunikation, mit der ich bisher noch keine Erfahrungen gemacht habe. " nen Messenger bzw. chat haben will, das man eigendlich irgendwie aus seinem posting herauslesen kann.

    wie kommt man dann auf postings wie :
    "erstmal solltest du dir überlegen über welche schnitstelle(n) du das realisieren willst. willst du das ganze mit directX machen? (DirectPlay)
    oder lieber über sockets? (korrigiert mich bitte, wenn ich falsch liege, aber ich mein die 2te möglichkeit waren doch sockets oder? *gg*)

    Aber ich glaub, directX ist besser, da du ja in Zukunft auch sicher spiele schreiben willst, und die netzwerkkommunikation da besser über directX o.ä. laufen sollte 🙂
    " ?????? wie kommt man auf sowas ???

    oder :
    "Also wenn du nur auf die Kommunikation im Netz wert legst, dann installiere doch auf deinem Server einen IRC-Server . Oder du installierst einen Webserver und erstellst eine Intranet-Site mit Forum als Kommunikationsebene."

    oftmals koennte man glauben, die leute schreiben grad mal was rein, damit sie ihre beitraege nach oben schraufen koennen.

    nein, das soll kein angriff auf euch sein. aber mir ist schon oft aufgefallen, das die antworten auf postings nicht unbedingt was damit zutun haben.

    hoffe ihr seit mir nicht boese, weil ich euch das mal gesagt habe.
    weil ansich finde ich das forum sehr gut. nicht nur, weil ihr mir auch schon oft geholfen habt ;o)

    Meep Meep



  • Meep Meep schrieb:

    oftmals koennte man glauben, die leute schreiben grad mal was rein, damit sie ihre beitraege nach oben schraufen koennen.

    Ne, das ist es nicht, du. Die wollen nur zeigen, was sie alles so dolles drauf haben. Kurzum: Angeberei! Aber auf sowas trifft man hier immer wieder.


Anmelden zum Antworten