Socket-Problem



  • Hallo :>
    Ich wende mich an euch, habe grad erst angefangen etwas Socketprogrammierung zu lernen.

    Also, ich habe zum Üben ein kleines "Wettspiel" gemacht, jeder Spieler hat einen Grundbetrag und kann wetten. In der Mitte ein "Server-Programm" das alles verwaltet. Nur macht mir gerade der Server Kopfzerbrechen.

    1.) Ich möchte das Programm, das als Server fungiert nicht ewig in der accept()
    und recv() bzw send() Schleife hängen lassen, sondern aktiv per Hand etwas eingeben können.

    2.) Will ich an bestimmte Clients bestimmte Daten senden. Zum Beispiel, jedem Spieler seinen aktuellen Status. So wie im Moment hängen alle an einem Socket und ich kann häöchstens an alle schicken.

    3.) Mit der accept()-Funktion kann ich ja einen Pointer auf eine Verbindungsstructure übergeben in dem Daten gespeichert werden.
    Habe es im Moment so gelöst:

    ....
    
    sConnectionSocket=accept(sListenSocket, (SOCKADDR*) &client_data, NULL);
    
    ...
    
    cout << endl << "Connection with " << inet_ntoa(client_data.sin_addr) << " accepted !" << endl << endl;
    
    ...
    

    Bekomme aber seltsamerweise immer nur eine Adresse 144.x.x.x zurück.

    Ich weiß nicht in wieweit es möglich ist, meine Anliegen zu lösen.
    Ich werde mich mal an Threads ranmachen, das sollte zumindest 1.) lösen können. Obwohl ich meine etwas von asynchronen Sockets gehört zu haben die Interrupt Senden/Empfangen können.

    Bei 2.) und 3.) bin ich total ratlos.

    Newbie-Grüße,
    Icematic 😉



  • Hallo

    Zu 1)
    Schau doch mal nach dem Macro FD_SET() bzw FD_ZERO().

    Bzw hier nen kleines Beispiel:

    timeval tvTimeout;
       int     _nScheduleInterval = 2000; // Schedule in mSec
       FD_SET _fdSet;
    
       // Wait for x seconds
       tvTimeout.tv_sec    = _nScheduleInterval / 1000;
       tvTimeout.tv_usec   = _nScheduleInterval % 1000;
    
       FD_ZERO(&_fdSet);       // Inhalt leeren
       FD_SET(_acceptSocket, &_fdSet);     // Den Haupt-Socket der die Verbindungen annimmt hinzufuegen
       // Hier noch weitere Sockets (die die Verbindung der Clients halten) hinzufuegen ueber FD_SET
    
       if( SOCKET_ERROR == select(0, &_fdSet, NULL, NULL, &tvTimeout) ) {
          // Fehler
       }
       else {
          if( FD_ISSET( _acceptSocket, &_fdSet ) ) {
             // Neuer client kamm an
             neuerClientSocket = accept( _acceptSocket, NULL, NULL )
          }
          // hier noch die vorhanden Clients mit FD_ISSET ueberpruefen ob sie noch drin sind, dann haben sie Daten geschickt
          // wenn ja dann so mit recv daten ermitteln:
          rc = recv( clientSocket, chTextBuf, g_MAXLEN_BUF, 0 );
          if( 0 == rc || SOCKET_ERROR == rc ) {
             // Client hat die Verbindung geschlossen
          }
          else {
             // Hier die geschickten Daten auswerten....
          }
       }
    

    Zu 2)
    Ich mache des immer so das ich die sockets der Clients in ne Liste stecke, so kannst du an jeden die Daten zurueckschicken.

    Zu 3)
    Kann ich dir leider net helfen

    Hoffe ich konnt dir damit helfen. Sollte es nicht weiter helfen, kannst mir ne PM schicken, dann kann ich dir nen kleines Projekt schicken das nen ChatSvr ist und dieser entsprechend Clients verwaltet genau auf diese Weise.

    Mfg Marco


Log in to reply