select und nicht verbundener Socket = Endlosschleife?



  • Hallo,

    ich habe ein Programm welches sich zu mehreren Servern verbindet. Diese werden mit select() abgefragt, ob sie zum lesen bereit sind.

    Tritt jetzt der Fall ein, dass sich das Programm nur zu einem Server verbindet und der irgendwie abstuerzt, dann wird derjenige Socket immer als "bereit" markiert und es entsteht eine Endlosschleife.
    Hier ein Codebeispiel:

    for(;;)
        {
          FD_ZERO(&rset);
          maxfd1 = -1;
          for(i = 0; i < networks; i++)
    	{
    	  FD_SET(serv[i].s, &rset);
    	  maxfd1 = max(serv[i].s, maxfd1);
    	}
          switch(select(maxfd1+1, &rset, NULL, NULL, &timeout))
    	{
    	case 0:
    	  errorlog("Select:", "Timeout", DISF);
    	  break;
    	case -1:
    	  errorlog("Select:", strerror(errno), DISF);
              break;
    	default:
    	  for(i = 0; i < networks; i++)
    	    {
    	      if(FD_ISSET(serv[i].s, &rset))
    		myread(i);
    	    } 
    	}
        }
    

    Wie soll ich jetzt am besten Vorgehen um dieses Problem zu vermeiden? Gibt es eine Funktion die einen Socket "testet" ob das Gegenstück noch aktiv ist? Oder muss ich vor jedem Schleifendurchgang, vor select(), eine Art "Ping-Funktion" hinstellen? Das wuerde das Ganze ja ziemlich verlangsamen(auf jeden "PONG" warten...).
    Oder verwende ich select() einfach voellig falsch?

    Das Ganze soll unter FreeBSD laufen.

    Ich bin fuer jeden Ratschlag und Tipp dankbar!

    mfg,
    --- "frage"



  • wenn select in diesem fall zurueckkehrt sollte dir read -1 liefern.
    dann weisst du, dass ein fehler aufgetreten ist und musst den socken
    aus rset austragen.
    ansonsten kannst du jeden server austragen, der sich nach x sekunden
    nicht gemeldet hat (das siehst du ja nach jedem select, merk dir
    einfach zu jedem socket-fd noch die zeit seit dem letzten "kontakt").


Anmelden zum Antworten