Sockets - Client kann nicht connect()en ?



  • ich hab das mal hier hin gestellt, weil sockets ja theoretisch Systemunabhängig sind..

    Mein Problem ist, dass mein Clientprogramm keine Verbindung zum Server bekommt
    (WSAGetLastError ist 10061 - Server lehnt verbindung ab; möglicherweise kein Server da.. ) Auch ne Verbindung per Telnet klappt nicht..

    Der Server hat also scheinbar nen Problem beim Verbinden. Ich hab meinen Server von einem Chatserver abgeschaut (c-worker.ch).

    da ich grade keine Verbindung zum Netz hab (zumindest nicht mit meinem Notebook) tippe ich mal nur nen Fragment vom Server ab :

    ...
      while (true)
      {
         FD_ZERO (&fdSet);
         FD_SET(ServerSocket, &fdSet);
         for (i = 0; i < ini.MaxClients; i++) /*Anm: 100 Clients sind vorgesehen*/
         {
            if (clients[i].used == true)
            {
    	   FD_SET(clients[i].socket, &fdSet);
            }
         }
    
         rc = select (0,&fdSet, NULL,NULL,NULL);
         if (rc < 1) break;
    
         ...
    

    Nun sollte der select afaik doch warten bis ein Client eine Verbindung aufbauen will, oder nicht ? Scheinbar wartet der select aber auf etwas, das nicht eintritt...

    Meine clients-struktur sieht so aus :

    struct sCon
     {
        int         used;
        SOCKADDR_IN addr; 
        SOCKET      socket;
     };
    

    hat da wer ne Idee ?



  • Hab den Fehler gefunden.
    Der Client war trotz Neustart nicht kompiliert worden und hatte noch den Port 23 drin 😃

    Auf jeden Fall hatte ich noch nen anderen Fehler 3 Zeilen unter dem oben angegebenen Code, der ist aber ausgebügelt..
    Allerdings überlege ich, ob eine asynchrone Verarbeitung (Der Server wartet nach dem Senden von Daten an den Client nicht auf dessen Antwort, sondern macht erst einmal weiter mit allen Clients und fragt anschließend mit einem select() die Clients ab, die etwas zu melden haben) oder eine synchrone ( eben das Warten des Servers auf eine Antwort des Clients ) bevorzugen sollte.

    Naja, wahrscheinlich lieber ersteres, dasich sonst bei einem kaputten Client der Server gleich aufhängt..



  • Kommt auch drauf an *wofür*! 🙂



  • Naaja, sagen wir mal so. Die Grundidee ist fast nen Gameserver - also CS-Server oder so.
    Allerdings will ich das für etwas sinnvolleres nutzen..



  • Also wenn du vorher schon weist, welche Daten und vor allem von welchem Client ankommen werden, dann kannst du synchron arbeiten. Aber wenn die daten zufällig, also ohne eine feste Reihenfolge (ohne Regeln für Client und Server) ankommen, dann kommt eigentlich nur die asynchrone Kommunikation in Frage.

    Eine andere möglichkeit die Kommunikation mit je einem Client in einem Thread laufen zu lassen und dann doch die synchrone Kommunikation verwenden.



  • Glaubst du das ein Programm 100 Clients bedienen kann?

    Müssen die CLients untereinander kommunizieren?

    Maches wie früher.
    Der Server wartet auf einen Connect. Sobald ein Connect reinkommt erstellt er einen neuen Prozess (2 Mal Fork und es wird ein eigenständiger) der alles weitere macht.
    Der Server wartet wieder. So verhindert man auch das der Dienst nicht erreichbar ist wenn ein Client mit dem Server shit macht und sich der Server aufhängt.


Log in to reply