Funktioniert gethostbyname()auch LAN intern?



  • Hallo zusammen,

    ich möchte in einem Netzwerk, dass alle Clients per DHCP mit IP Adressen versorgt eine Verbindung zu einem Rechner aufbauen, dessen Name ich kenne, aber nicht dessen IP. Ich habe mit einige Bispielen, auch hier aus dem Forum folgenden Code zusammengeschrieben:

    addr.s_addr = inet_addr(ip);
    if (addr.s_addr == INADDR_NONE) 
    {
        /* "ip" ist ein name */
        remoteHost = gethostbyname(ip);
        if(remoteHost != NULL)
        {
            if (remoteHost->h_addrtype == AF_INET)
    	{
    	    addr.s_addr = *(u_long *) remoteHost->h_addr_list[0];
                strcpy(ip, inet_ntoa(addr));
    	    addr.s_addr = inet_addr(ip);
    	}
        }
        else netErr = WSAGetLastError();
    }
    else server.sin_addr.s_addr = addr.s_addr;
    

    Da ich davon ausgehe, dass der Zielrechner nur eine IP hat genügt mir auch remoteHost->h_addr_list[0]. Das ist aber nicht der Punkt. Ich kann mit diesem Code eine IP für de.wikipedia.org herausfinden, aber für interne Rechner in unserem LAN scheint es nicht zu funktionieren. Mit dem Debugger hat netErr den Wert 11001 (Host not found). Ich bemerke also, dass gethostbyname() den DNS Server fragt, aber den WINS nicht, oder liege ich da falsch? Kann ich das iegendwie steuern oder muss ich die Abfrage in dem Fall ganz anders aufziehen? Vielleicht liegt es auch an dem Name. Muss da Domain (wenn vorhanden) und/oder Arbeitsgruppe dazu oder genügt der reine Rechnername?

    Viele Grüße
    Ranger



  • Glasgow_Ranger schrieb:

    Ich bemerke also, dass gethostbyname() den DNS Server fragt, aber den WINS nicht, oder liege ich da falsch?

    Wie bemerkst du denn das?
    Ich würde mal behaupten dass gethostbyname überall nachfragt wo sonst auch nachgefragt wird. Oder anders gesagt: wenn gethostbyname den Namen net auflösen kann, dann wird ihn auch sonst kein Windows Programm auflösen können.

    Glasgow_Ranger schrieb:

    Vielleicht liegt es auch an dem Name. Muss da Domain (wenn vorhanden) und/oder Arbeitsgruppe dazu oder genügt der reine Rechnername?

    Kommt drauf an was bei den DNS Einstellungen eingestellt ist.

    ----

    Du solltest erstmal probieren es soweit hinzubekommen dass du die Namen mit anderen Windows Tools auflösen kannst - z.B. ping .
    Dazu musst du evtl. die Option "register this connection's name in DNS" setzen. Oder dem DHCP Server static Leases eintragen.
    WINS Server würde ich dafür aber keinen aufsetzen.



  • Hallo hustbaer,

    "ich bemerke" war falsch. Hätte schreiben sollen "ich vermute", aber auch damit hätte ich ja falsch gelegen. Ich versuch mal den namen anders aufzulösen.
    Mit den DNS Einstellungen kenn ich mich net so aus, das macht wer anders, den kann man aber fragen. 😉

    Danke für den Tip.

    Ranger



  • Glasgow_Ranger schrieb:

    Hallo hustbaer,

    "ich bemerke" war falsch. Hätte schreiben sollen "ich vermute", aber auch damit hätte ich ja falsch gelegen.

    Naja, ich vermute es genau genommen auch nur. 🙂
    Ich hab geschrieben "ich behaupte mal", weil es eine Vermutung ist wo ich mir ziemlich sicher bin. Extra ausprobiert hab' ich es aber auch nicht.

    Glasgow_Ranger schrieb:

    Ich versuch mal den namen anders aufzulösen.

    Ja. Probier einfach mal einen Namen der mit gethostbyname nicht funktioniert mit ping name . Ob der Ping selbst dann geht oder nicht ist egal, aber du siehst dann anhand der ausgegebenen Meldungen ob er schon bei der Namensauflösung ein Problem hat, oder erst später.



  • Und wieder hab ich was vergessen zu erwähnen. Ich dachte es macht keinen Unterschied, ob WinCE oder Windows7, scheint es aber doch zu machen. Mein Problem tritt nur unter WinCE auf.
    Ich habe Deinen Rat befolgt und ping <name> gemacht auf meinem PC, ging super. Auf dem CE-Gerät nicht, da kam "Bad IP adress (null)", ich vermute mal, er versucht es aufzulösen, der Name existiert, aber keine IP. Das bestätigt auch der Versuch, den ich danach gemacht habe. Ich habe den verwendeten Quellcode (siehe weiter oben) in eine einfache Consolenanwendung unter Windows7 gepackt. Nun weiß ich wenigstens dass er funktioniert, denn die Namen der PCs in unserem LAN löst er prima auf. Wenn ich den Namen des CE Gerätes verwende kommt der WSA Fehler 11004:

    Valid name, no data record of requested type.

    Der angeforderte Name ist gültig und wurde in der Datenbank gefunden, aber es sind ihm nicht die korrekten aufgelösten Daten zugeordnet. Das übliche Beispiel hierfür ist ein Versuch, einen Hostnamen mit dem DNS (Domänennamenserver) in eine Adresse aufzulösen (mit gethostbyname oder WSAAsyncGetHostByName). Es wird ein MX-Eintrag, aber kein A-Eintrag zurückgegeben—womit angezeigt wird, dass der Host vorhanden, aber nicht direkt erreichbar ist.

    Also der Name ist bekannt, aber es existiert kein Datensatz dazu. Hat da jemand eine Idee, was ich noch machen könnte? Kann der WLAN Access-Point die Schranke sein?

    Viele Grüße

    Ranger



  • WLAN Access Point als Problem würde ich eher ausschliessen. So lange es wirklich ein reiner Access Point ist. Wenn der routet oder firewallt, dann könnte es sein.

    Und auf jeden Fall musst du es erstmal hinbekommen dass die Namensauflösung mit normalen Windows-Tools wie eben ping funktioniert.
    Ohne das geht gar nix. Zumindest nicht mit TCP/IP.

    Und das, also die Namensauflösung, kann soweit ich weiss unter (Desktop) Windows auf einem von drei (vier) Wegen passieren:
    0) Statische Einträge, z.B. im HOSTS/LMHOSTS File

    1. DNS (IMO beste Option)
    2. WINS
    3. NetBIOS Broadcast

    (3) ist allerdings oft deaktiviert, z.B. in den meisten Firmennetzwerken.

    Und damit (1) funktioniert, muss der Fragende natürlich einen DNS verwenden der die angefragte Adresse auch kennt. Typischerweise wenn beide den selben DNS verwenden, und beide so eingestellt sind dass sie ihre eigene Adresse beim Start im DNS hinterlegen (und der DNS dies auch erlaubt).



  • Ich hab nen neuen Ansatz gefunden, der auch hier im WinAPI Forum bereits auftauchte.

    getaddrinfo()
    

    Werde es damit versuchen, diese Funktion ist der Nachfolger von gethostbyname().
    Als ein Netzwerktool unseres Admins den Namen des CE-Geräts auflösen konnte wussten wir, es muss irgendwie gehen. Ich versuch es erstmal so und berichte von Ergebnissen.

    Danke erstmal

    Ranger


Anmelden zum Antworten