gethostbyname() Timeout setzten?



  • Hallo zusammen,

    ich programmiere einen TCP Client. Connect() benötigt eine DNS Adresse also ist meine erster Schritt den Namen mit gethostbyname() aufzulösen. Das klappt auch wunderbar, nur geht man im schlimmsten Fall davon aus, das der Anwender keine Verbindung zum Ziel Rechner hat passiert wärend gethostbyname() srbeitet, für 20 Sekunden gar nichts.

    Kann ich irgendwie für die Funktion gethostbyname() einen Timeout setzten? Ohne die DNS Adresse habe ich wohl auch keine andere Möglichkeit um die verbindung vorher zu überprüfen oder?

    Vielen dank

    Gruß

    Kolja



  • wenn dein system keine einstellung dafür bietet (ich glaube jedenfalls, dass es keine socket-option dafür gibt), könntest du...
    1. den gethostbyname-aufruf in einen eigenen thread auslagern, den du nach belieben killen kannst, oder...
    2. einen dns-client als source code irgendwo im netz suchen, oder...
    3. einen dns-client selber coden (braucht 'nen udp-socket, ist nicht so schwer).
    🙂



  • kenne mich da jetzt nicht so genau aus aber da gibts auch noch andere funktioen um den namen aufzulösen, z.b. getaddrinfo(), wobei in der MSDN eh steht, dass gethostbyname() veraltet ist. alternativ kannst auch mit threads rumspielen oder ich glaube man kann sogar den status von sockets mit einem timer abfragen. habe die funktion noch nie verwendet aber gerade mal in der MSDN gesehn: WSAPoll()
    der Parameter von WSAPoll beinhaltet auch einen SOCKET, musste halt genauer nach der struktur suchen und wie man das umwandelt. hier gibts übrigens alle winsock funktionen, falls dus noch nicht kennst:
    MSDN: winsock funktions



  • sorry aber ich habe vergessen zu erwaehnen das es sich um ein Linux Programm handelt. Ja mit Threads könnte ich arbeiten, allerdings verkürzt das ja auch nicht die Wartezeit. Mir würde es reichen, das wenn der Server nach 5 Sekunden nicht antwortet, abgebrochen wird. Da würde mir wohl nur die Möglichkeit des selber programmierens übrig bleiben.



  • hebru schrieb:

    sorry aber ich habe vergessen zu erwaehnen das es sich um ein Linux Programm handelt. Ja mit Threads könnte ich arbeiten, allerdings verkürzt das ja auch nicht die Wartezeit.

    klar, den thread nach 5 sec. killen, wenn er noch kein ergebnis geliefert hat. so stabil wird linux ja wohl sein, dass es das verkraftet.
    🙂



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI 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.



  • zum einen gäbe es http://www.chiark.greenend.org.uk/~ian/adns/. die lösung is immer noch besser als die thread lösung (man sollte nie einfach threads killen, schon gar nicht, wenn sie gerade funktionen anderer bibliotheken verwenden. das kann böse enden.) die lösung mit dem eigenen dns code (das geht komplett an system- oder netzwerkeinstellungen vorbei. woher z.b. bekommst du den dns server, den das system verwendet. was ist, wenn jemand z.b. DNSSEC verwenden will? jeder admin wird dich dafür hassen.) ist noch viel schlechter.
    grundsätzlich sollte das egal sein mit dem timeout, da es das standardverhalten von anwendungen ist. wenn jemandem das timeout zu lang ist, muss er das im system konfigurieren. mach dir da keine sorgen darüber.


Anmelden zum Antworten