Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Server verwaltet Clients per Threads

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
03.12.2007, 11:59 Uhr
Mr.Bean06



Hallo,

ich würde gerne realisieren, das mehrere Clients ein Lebenszeichen an einen Server senden, und diese Clients beim Server über Threads verwaltet werden.
Die Clients sollten dann in einer Liste oder Map gespeichert werden und einen "Lebenszeichentimer" bekommen.
Wie muss ich dieses Problem am besten angehen?

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.12.2007, 12:42 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Indem du zum Beispiel den Server auf einem Port lauschen lässt wo die Clients sich registrieren können. Da bekommen sie dann vom Server eine andere Portnummer zugeschickt wo der Server jetzt in einem neuen Thread auf eine Verbindung wartet.
Der Client macht dann die Verbindung wieder zu und macht eine neue zu dem vom Server gesendeten Port auf wo die beiden dann kommunizieren.

Das selbe dann mit allen Clients. Ist ziemlich einfach aber jetzt auch nicht unbedingt die Beste Lösung...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.12.2007, 12:52 Uhr
Mr.Bean06



Danke, vom Prinzip her muss es auch nicht so kopliziert sein, es geht eben hauptsächlich darum, das die Verwaltung der Clients durch Threads übernommen wird...
Kannst du mir evt. auch noch ein paar Codeschnipsel mitgeben?

Hier mal mein Servercode (was müßte ich hier verändern?)


C++:
int main()
{
    WSADATA wsa;
    //initialisierung von Winsock (Parameter(Version, Infos zur API))
    WSAStartup (MAKEWORD (1,1) ,&wsa);


    SOCKET listenSocket;
    listenSocket = socket (AF_INET, SOCK_STREAM, 0 );
    int clientNummer = 0;
        
    sockaddr_in addr;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons (1001);
    addr.sin_family = AF_INET;

    if(bind(listenSocket,(struct sockaddr*)&addr, sizeof(addr)) == -1)
    {
        cout<<"Fehler bei bind";
    }    
            
    if (listen(listenSocket,3) == -1)
    {
        cout<<"Fehler beim listen";
                
    }
    printf("Waiting for client to connect...\n");

    SOCKET clientSocket = accept(listenSocket,(struct sockaddr*)&addr, 0);
    if (clientSocket == -1)
    {
        cout<<"Fehler bei accept";
        closesocket(listenSocket);
    WSACleanup();
    return 1;

    }
    cout<<"Client connected."<<endl;

    char buffer[254];
    int bytes;
    
    //Daten die empfangen werden
    bytes = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);
  

    buffer[bytes] = '\0';

  
    cout<<buffer;
    MessageBox(0, buffer, "Client Connect!", MB_ICONINFORMATION);
    
    //listenSocket wird geschlossen
    closesocket(listenSocket);
    WSACleanup();

    cout<<"Close Connect";
    cin.get();
    return 0;
}



und auch noch der Client:


C++:
#include "stdafx.h"
#include <iostream>
#include <winsock2.h>

//Mitteilung an den Linker, wo sich die nötigen Implemanteation der Winsock Funktionen befinden
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main()
{
    WSADATA wsa;
    //initialisierung von Winsock (Parameter(Version, Infos zur API))
  WSAStartup (MAKEWORD (1,1) ,&wsa);

    //Schnittstelle zur Netzwerkschicht
    SOCKET s;
    char clientNummer[254] = "Client 1\r\n";
    //Socket beinhaltet (IP, TCP, Raw-Sockets das Protokoll)
    s = socket (AF_INET, SOCK_STREAM, 0 );
    
    //hier wird die Serveradresse gespeichert    
    sockaddr_in addr;
    //umwandeln von einem IP Strin in einen 4 byte Wert
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    //mit htons wird ein short (TCP Ports) von host byte order (höchstes byte links) in network byte order umgewandelt (höchstes byte rechts)
    addr.sin_port = htons (1001);
    //Adressenfamilie -> IP
    addr.sin_family = AF_INET;

    //Verbindung zum Server (Verbindung zum eigenen Socket, Serveradresse, Größe der Serveradresse)
    if(connect(s, (SOCKADDR *) &addr, sizeof(addr)) == SOCKET_ERROR)
        //wenn kein Connect, dann gibt es einen Socketerror und es wird eine Fehlermeldung ausgegeben
        return (MessageBox(0, "Verbindung fehlgeschlagen!", "WinSock Tutorial Series", MB_ICONEXCLAMATION));
    
    //zusendene Daten(mein Socket, den wert aus dem Buffer, Länge des Buffer, Flag)
    send(s, clientNummer, strlen(clientNummer), 0);

    cout<<"\nEnde";
    cin.get();
    return 0;
}

Danke schon mal im Voraus.

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: