[C/C++] Netzwerk Timeout realisieren

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Chillikid, 1. Januar 2009 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  1. #1 1. Januar 2009
    Netzwerk Timeout realisieren

    Hallo,

    momentan stehe ich vor einem kleinen Problem:
    Ich habe mir eine Socket-Klasse gebaut und kann damit auch wunderbar alles machen, aber wenn ich zu einer IP-Addressse verbinde, die nicht erreichbar ist, dauert es entweder ziemlich lange oder ewig, bis es eine Exception gibt. Ich würde lieber selber ein Timeout einstellen können!

    Nur wie mache ich dass denn am besten? Ich hatte mir sowas gedacht(teilw. Pseudo-Code weil ich ja die umsetzung nicht hinkriege):
    Code:
    void connectFunction() { //macht den connect aufruf etc. hier nicht weiter wichtig }
    
    time_t zeit = time(NULL);
    [B]Thread starten der connectFunction() macht[/B]
    while(true) {
     if([B]Thread läuft noch[/B]) {
     if(zeit + timeout < time(NULL)) [B]Thread beenden und exception werfen[/B]
     }
     else break;
     [B]3 Sekunden o.ä. warten, damit die Rechenleistung nicht so hochgeht[/B] 
    }
    
    Bei dem Fetten bräuchte ich halt Hilfe von euch :)

    Chillikid
     

  2. Anzeige
  3. #2 1. Januar 2009
    AW: Netzwerk Timeout realisieren

    So kompliziert musst dus gar nich machen ;)
    Es gibt ne nette Funktion die nennt sich select(). Damit kann man schauen, ob man auf Sockets (die man in nem speziellen Array speichert) was lesen/schreiben kann oder ob ein Fehler aufgetreten is. Und man kann auch einen Timeout angeben.

    Hier gibts bissl was zu lesen: Zotteljedis Tipps zur Socket-Programmierung

    Damit du auf connect() "warten" kannst, musst du den SOCKET auf non-blocking setzen und danach wieder auf blocking. Du kannst dir aber mal andere Bibliotheken anschauen, wie die das lösen (z.B. Poco)
     
  4. #3 1. Januar 2009
    AW: Netzwerk Timeout realisieren

    Ok, danke schonmal...
    Also ich habe jetzt verstanden, dass man den Socket auf Non-Blocking stellen muss, dann select() aufruft und der Rückgabewert sollte != 1 sein, wenn alles erfolgreich war, oder?

    Nur weiß ich jetzt leider immer noch nicht, wie ich einen Socket auf Non-blocking stelle und was diese fd_set Parameter von select() darstellen soll. Wäre schön, wenn du mir das nochmal erklären könntest.
     
  5. #4 1. Januar 2009
  6. #5 1. Januar 2009
    AW: Netzwerk Timeout realisieren

    Joa...den hatte ich wohl gesehn und ich denke mir zumindenst, dass das hier für das Blocking ist, oder?

    opt = 1;
    ioctlsocket(sock, FIONBIO, &opt);

    Aber mit diesen fd_set Parametern weiß ich leider trotzdem nichts anzufangen. Außerdem (optional) fände ichs noch interessant zu wissen, was FIONBIO bewirkt/bedeutet, ich denke jetzt einfach mal, dass das sozusagen die Einstellung (in diesem fall Blocking) ist die man verändern will und das opt dann der Wert?

    PS: Würde dir liebend gern 100 BWs verpassen, aber geht leider net :p
     
  7. #6 1. Januar 2009
    AW: Netzwerk Timeout realisieren

    hab jetzt keine doku zu hand, aber unter unix zum beispiel ist die connect() funktion nicht reentrant fähig, das heißt du kannst sie durch ein signal + signalhandler unterbrechen.
    Ich würde das mittels der alarm() funktion relasieren.

    Code:
    alarm(15); //Statet intern einen Timer der nach 15 Sekunden ein Signal schickt
    status = connect(parameter); //Nach 15 Sekunden würde die connect funktion durch das signal unterbrochen werden
    alarm(0); //Timer wieder ausschalten, falls noch nicht geschehen
    jetzt noch gucken ob status gleich -1 (oder wars 0?) für fehler gesetzt wurde, ansonsten hat der connect geklappt.

    sag wenn dus ausführlicher brauchst
     
  8. #7 1. Januar 2009
    AW: Netzwerk Timeout realisieren

    Soo ich hab jetzt nochn bisschen rumprobiert und lag mit meinen Vermutungen richtig, daher funktioniert es jetzt auch perfekt. Danke pyro und crunsh, ich hab deinen Tipp zwar nicht gebraucht, aber dass wäre dann halt die Notlösung gewesen :p (ist nämlich würde ich mal behaupten, nicht der beste Programmierstil so etwas zu verwenden, genauso wie system("PAUSE")^^)
     

  9. Videos zum Thema
Die Seite wird geladen...