Sockets: Timeout bei connect, bzw ping selber bauen?



  • hallo,
    ich habe ein programm, das meldungen ueber sockets verschickt. hierzu muss zu ca. 10 maschinen eine tcp verbindung aufgebaut werden. dann werden kurz daten uebertragen und die verbindung muss wieder abgebaut werden. leider sind nicht alle 10 maschinen immer online. die connect funktion kehrt nach ca 3sec zurueck, wenn der host nicht erreichbar ist. bei 10 maschinen gehen im unguenstigsten fall 27sec ins land, bis die letzte maschine connected wird. threading kommt als loesung nicht in frage!
    nun zu den fragen:
    1 - kann das connect timeout irgendwo eingestellt werden, zb auf 0,1sec?
    2 - wenn ich aus dem programm ein ping ausfuehre (mit eigenem source), koennte ich die zeit ebenfalls reduzieren. wie funktioniert das protokoll fuer ping?



  • am einfachsten kannst du das mit alarm bzw ualarm:

    void connect_alarm(int s)
    {
      // dummy funktion
    }
    
    //...
    
    signal(SIGALARM,connect_alarm);
    alarm(1); // warte 1 sekunde, bzw. ualarm fuer
    int i = connect(....);
    if ( i == EINTR )
      // timeout connect_alarm wurde aufgerufen
    alarm(0); // wichtig timer deaktivieren
    

    http://www.opengroup.org/onlinepubs/009695399/functions/alarm.html

    oder alternativ mit nicht blockierenden sockets und select.
    da hab ich auch nen bsp fuer das ich dir mailen kann.



  • Entschuldigung, dass ich diesen "alten Thread" noch einmal ausgrabe, aber ich hätte ein ergänzende Frage bezüglich alarm().

    Nachdem ich die Timeout-Funktion eines Socketprogramms beim connecten über die oben genannte alarm()-Funktion bewerkstelligt habe, habe ich nun das Problem, dass das Programm - nachdem der Handler (i. Bsp: signal(SIGALARM,connect_alarm);) aufgerufen wurde - einfriert. D.h. Weder die aufrufende Funktion, noch main() laufen weiter.

    Gibt es eine Möglichkeit den alarm-Handler zu stoppen?

    Ein "return irgendwas" geht anscheinend nicht in einer void-Funktion.

    Bin über jegliche Hilfe dankbar.



  • Kennt wirklich keiner eine Möglichkeit den alarm-Handler zu stoppen?

    Vielleicht gibt es ja noch eine andere Alternative bezüglich der Verwendung einer Timeout-Funktion beim Socket-Connect()?



  • Den alarm-Handler kannst du dadurch stoppen, in dem du alarm(0) aufrufst.



  • [/quote]Vielleicht gibt es ja noch eine andere Alternative bezüglich der Verwendung einer Timeout-Funktion beim Socket-Connect()?[/quote]
    Die gibt es. Siehe: nonblocking-connect() + select().

    mfg unixer


Anmelden zum Antworten