Sockets und Blocking/Non-Blocking...



  • Hallo,

    ich schreibe grade einen Daemon mit Serverfunktionalität unter Linux. Ich verwende den gcc compiler. Ich hab nun das Problem das wärend der Daemon läuft in bestimmten Intervalen ein Event aufgerufen werden muß. Den Aufruf wollte ich in der Server while Schleife machen, leider hab ich die Sockets auf Blocking gestellt, wodurch das Programm scheinbar hängen bleibt, bis es eine connection auf dem entsprechenden Port bekommt. Hier erstmal ein Teil des Quellcodes:

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
      // WICHTIG: Set non-blocking (wichtig für Ticker!):
      int i = 1;
      ioctl(sockfd, FIONBIO, &i);
    
      bzero((char *) &serv_addr, sizeof(serv_addr));
    
      portno = atoi(port.c_str());
    
      serv_addr.sin_family = AF_INET;
      serv_addr.sin_addr.s_addr = INADDR_ANY;
      serv_addr.sin_port = htons(portno);
    
      if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
      {
        syslog(LOG_ERR, "Error on binding");
      }
    
      listen(sockfd, 10);
    
      while(true)
      {
        // WICHTIG: Ticker abfragen:
        this->ticker();
    
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        fork etc...
        ...
      }
    

    Die wichtigen Passagen sind mit "WICHTIG" gekennzeichnet...

    Nun hab ich das ganze auf Non-Blocking gestellt (siehe WICHTIG Passagen). Theoretisch müsste das Programm ja nun immer weiter laufen, und so die Ticker Funktion auch immer aufgerufen werden. Das klappt auch, allerdings kann ich nun nicht mehr via Telnet auf den Daemon connecten. 😞

    Kann mir jemand helfen wie ich bei dem Programm dauerhaft eine Methode aufrufen kann die checkt ob es wieder mal Zeit für einen Event ist, oder noch nicht, und das gleichzeitig der Server weiter auf dem entsprechenden Port horcht?

    Benny



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.




Anmelden zum Antworten