Client + Client -> Server



  • Hallo liebe Community.
    Ich hab eine (für Euch vielleicht einfache) Aufgabe. Ich habe mir einen Server und einen Client programmiert. Das funktioniert soweit alles, d.h. dass wenn ich Daten von Client1 sende, dann empfängt der Server sie auch. Nur, wenn ich einen zweiten Client starte, dann verbindet er zwar, sendet jedoch keine Daten an den Server. Mir kommt es so vor, als hätte ich eine "Support-Ähnliche" Software programmiert, in der es eine "Warteschlange" gibt und jeder nach und nach drankommt 😃

    Meine Frage, wie kann ich es dem Server ermöglichen, 2 oder mehr Clients gleichzeitig kommunizieren zu lassen?

    Hier die beiden "fertigen" Quellcodes:

    Client

    #pragma comment (lib, "ws2_32.lib")
    #include <WinSock2.h>
    #include <Windows.h>
    #include <iostream>
    #include <conio.h>
    
    int startWinsock()
    {
    	WSADATA wsa;
    	return (WSAStartup(MAKEWORD(2,0), &wsa));
    }
    
    int main()
    {
    	int rc;
    	char buf[] = "Hallo Server!";
    	SOCKET s;
    	SOCKADDR_IN addr;
    
    	rc = startWinsock();
    	if(rc != 0)
    	{
    		std::cerr << "Fehler beim Starten des WinSock!\n";
    		_getch();
    		return 1;
    	}
    	else std::cout << "WinSock wurde erfolgreich gestartet!\n";
    	s = socket(AF_INET, SOCK_STREAM, 0);
    	if(s == INVALID_SOCKET)
    	{
    		std::cerr << "Fehler beim Erstellen eines Sockets!\n";
    		_getch();
    		return 1;
    	}
    	else std::cout << "Socket wurde erfolgreich erstellt!\n";
    	memset(&addr, 0, sizeof(SOCKADDR_IN));
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons(12345);
    	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    	rc = connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    	if(rc == SOCKET_ERROR)
    	{
    		std::cerr << "Fehler beim Verbinden!\n";
    		_getch();
    		return 1;
    	}
    	else std::cout << "Client verbunden!\n";
    
    	while(true)
    	{
    		_getch();
    		rc = send(s, buf, sizeof(buf), 0);
    		if(rc == SOCKET_ERROR)
    		{
    			std::cerr << "Fehler beim Senden von Daten!\n";
    			_getch();
    			return 1;
    		}
    		else std::cout << "Daten erfolgreich gesendet!\n";
    	}
    
    	_getch();
    	return 0;
    }
    

    Server

    #pragma comment (lib, "ws2_32.lib")
    #include <WinSock2.h>
    #include <Windows.h>
    #include <iostream>
    #include <conio.h>
    
    int startWinsock()
    {
    	WSADATA wsa;
    	return (WSAStartup(MAKEWORD(2,0), &wsa));
    }
    
    int main()
    {
    	int rc;
    	char buf[256];
    	SOCKET s;
    	SOCKET connectedSocket;
    	SOCKADDR_IN addr;
    
    	rc = startWinsock();
    	if(rc != 0)
    	{
    		std::cerr << "Fehler beim Starten von WinSock!\n";
    		_getch();
    		return 1;
    	}
    	else std::cout << "WinSock wurde erfolgreich gestartet!\n";
    	s = socket(AF_INET, SOCK_STREAM, 0);
    	if(s == INVALID_SOCKET)
    	{
    		std::cerr << "Fehler beim Erstellen eines Sockets!\n";
    		_getch();
    		return 1;
    	}
    	else std::cout << "Socket wurde erfolgreich erstellt!\n";
    	memset(&addr, 0, sizeof(SOCKADDR_IN));
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons(12345);
    	addr.sin_addr.S_un.S_addr = ADDR_ANY;
    	rc = bind(s, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    	if(rc == SOCKET_ERROR)
    	{
    		std::cerr << "Fehler beim Verbinden!\n";
    		_getch();
    		return 1;
    	}
    	else std::cout << "Socket gebunden mit Port 12345\n";
    	while(true)
    	{
    		rc = listen(s, 10);
    		if(rc == SOCKET_ERROR)
    		{
    			std::cerr << "Fehler beim warten auf Clients!\n";
    			_getch();
    			return 0;
    		}
    		else std::cout << "Server wartet auf Clients!\n";
    		connectedSocket = accept(s, 0, 0);
    		if(connectedSocket == INVALID_SOCKET)
    		{
    			std::cerr << "Fehler beim Erstellen eines zu verbindenen Sockets!\n";
    			_getch();
    			return 1;
    		}
    		else std::cout << "\n\nNeuer Client wurde verbunden!\n";
    
    		while(true)
    		{
    			rc = recv(connectedSocket, buf, 256, 0);
    			if(rc == SOCKET_ERROR)
    			{
    				std::cerr << "Verbindung wurde getrennt!\n";
    				break;
    			}
    			else if(rc == 0) std::cerr << "Fehler beim Empfangen von Daten!\n";
    			else std::cout << "Daten empfangen: " << buf << '\n';
    		}
    	}
    
    	_getch();
    	return 0;
    }
    


  • entweder mit threads oder sonst asynchron

    Meep Meep



  • select(...)



  • kjhk schrieb:

    select(...)

    Klingt logisch 😛 😕



  • http://c-worker.ch/tuts/select.php

    Sollte dich das an deinen Grenzen bringen, dann ist Socket-Programmierung einfach noch zu früh für dich.


Anmelden zum Antworten