Sockets: Timeout bei recvfrom() setzen



  • Hallo!

    Ich würde gerne in meinem Programm einen recvfrom() Aufruf mit einem Timeout versehen. Wenn drei Sekunden keine Pakete mehr empfangen wurden soll recvfrom nicht mehr blockieren. Danach soll dann auf den Timeout reagiert werden (Socket schließen, thread beenden usw.). Ich habe es mit signal() und alarm() versucht aber irgendwie funktioniert das nicht.

    Wenn die drei Sekunden vorbei sind beendet sich aber mein ganzes Programm mit der Meldung "Alarm clock" auf der Konsole.

    Grob sieht es so aus:

    void *new_receivethread(void *threadargs)
    {
    ....
       signal( SIGALRM, CatchAlarm );
    ....
       for(;;)
       {
          /* Timeout setzen */
          alarm(3);
          printf("A");
          iBytesRecv = recvfrom( rcvsocket.iSocket, cBuffer, sizeof(cBuffer)-1, 0, (struct sockaddr *)&rcvsocket.addr, &rcvsocket_addrlen );
          printf("B");
    
          if (iBytesRecv < 0)
    	   	   {
    			   if (errno == EINTR)
    			   {
    				   perror("new_receivethread: Timeout!");
    				   break;
    			   }
    			   else
    			   {
    				   perror("new_receivethread: recvfrom() fehlgeschlagen");
    			   }
    		   }
    
          alarm(0);
    ....
       }
    }
    
    void CatchAlarm(int x) 
    {
    	printf("kdjklfjsdlfkjsdfklj\n");
    }
    

    Weder das "kdjklfjsdlfkjsdfkl" noch das "new_receivethread: Timeout!" taucht irgendwo auf der Konsole auf. Immer nur

    A
    B
    [...]
    A
    B
    A
    [3 Sekunden später]
    Alarm clock

    Und dann ist das komplette Programm beendet. 😞

    Hat jemand eine Idee warum das nicht funktioniert?

    Gruß
    Thorsten



  • Nimm sowas wie select().



  • Ah, darauf bin ich nicht gekommen 😞

    So ganz versteh ich das select() zwar noch nicht, aber wenn ich den Beispielcode aus der manpage 1:1 umsetze scheint es zu funktionieren.

    Danke für den Tip!!

    Gruß
    Thorsten


Anmelden zum Antworten