Round Robin und gethostbyname



  • Hi an alle,

    ich habe folgendes Problem. Wir haben intern eine domain

    dies.dom.tld. Über Round Robin ist diese mit 3 IP Adressen belegt.
    Wenn ich die domain mit nslookup aufrufe wird auch die IP Adresse ständig gewechselt.

    Nun starte ich meine Applikation. Doch egal wie oft ich sie starte erhalte ich bei gethostbyname immer dieselbe IP Adresse. Immer die erste aus der Liste.
    Was muss ich tun, das er bei starten der App zufällig eine der 3 IP Adressen wählt?

    Gruß



  • Klingt, als bräuchtest du Zufall (srand + rand). Und was meinst du hier mit "Round Robin", kenne ich eigentlich nur als Scheduling-Algo?



  • Also ich habe ganz einfach eine Domain eines Servers welche mit 3 IP Adressen belegt ist und im Round Robin Verfahren werden diese getauscht.
    Ich möchte einfach nur wissen ob ich hier noch irgendwas spezielles machen muss oder ob gethostbyname dieses von selbst mit bekommt?



  • Kann sein, dass Windows die aufgelösten Namen speichert und nicht jedesmal neu anfordert. Kannst du ja mit z.B. Wireshark überprüfen 🙂



  • Wie kann ich denn das mit Wireshark überprüfen ob Windows die cached?



  • Kannst halt schauen, ob jedesmal neu angefragt wird, siehst ja alle aus- und eingehenden Pakete plus die dabei verwendeten Protokolle.



  • Ne hab meine Fehler bereits gefunden.
    hostent - struktur hat die h_addr_list.
    Darin sind alle IP Adressen enthalten.

    Dann einfach random drauf ansetzen und schon klappt es wie ich es brauche;)



  • Also ich habe nun noch folgendes Problem. Sobald ich jetzt einen Server anspreche dem nur eine IP Adresse zugewiesen ist, dann könnte ich durch den zufälligen Index ja in Schwierigkeiten kommen.

    Dies wollte ich so abfangen

    srand(time(NULL));
    int nIndex = rand()%3;
    
    while(!ph->h_addr_list[nIndex])
        nIndex = rand()%3;
    
    saRemote.sin_addr.S_un.S_addr = *(unsigned long*)ph->h_addr_list[nAddrVal];
    

    Hier habe ich aber das folgende Problem.
    Ist jetzt nIndex = 1 dann wird NULL zurückgegeben und die Anweisung in der While schleife wird ausgeführt.
    Ist aber der Index = 2 kommt von h_addr_list[2] ein Bad Pointer zurück und bei dem versuch diesen in s_addr zu schreiben kommt es wie zu erwarten zu einem Programmabsturz.

    Wie kann ich denn abfangen ob es sich um einen Bad Pointer handelt?
    Oder kann ich vorab schon irgendwie herausfinden wieviele gültige Einträge sich in h_addr_list befinden?

    Gruß



  • mr. main schrieb:

    Oder kann ich vorab schon irgendwie herausfinden wieviele gültige Einträge sich in h_addr_list befinden?

    Zählen, an wievielter Stelle die NULL sitzt. Und dann logischerweise index = rand() % count .


Anmelden zum Antworten