funktion gethostbyname und Ergebnis auslesen



  • Hallo,

    Gleich vorweg, ich schreib in Assembler und habe eine Frage zur Rückgabe eine API Funktion.

    Es geht um gethostbyname()

    Ich übergebe einen Nullterminierten String mit meinem Computernamen.
    Als Rückgabe erhalte ich einen Zeiger auf eine Speicherstelle.

    Ich kopiere mir nun davon 16 Byte in meine hostent-Struktur.

    Wenn ich nun SetWindowText aufrufe und übergebe hier die Adresse von h_name, erhalte ich den FQDN meines Rechners. Soweit so gut.

    Die IP scheint mir aber wohl sehr versteckt zu sein. Folgendes hab ich im Netz gefunden:
    "h_list, welches eine mit 0 terminierte Liste von IP Adressen ist, und zwar in Network Byte Order (also kein htonl() nötig)."

    hier lese ich heraus das ich meinen Zeiger nur auf h_list setzen muss, dann hab ich meinen 32bit Wert in dem die IP enthalten ist. (geht aber nicht)

    Dann noch das hier:
    "h_list Erhält einen Pointer zu einem Long-Array, bei dem jedes Feld einen Pointer zu einem vier Felder großen Byte-Array enthält, das eine IP-Adresse beinhaltet. "

    Das gab mir den Rest.
    Falls der zweite Satz stimmt, könnte ihn mir bitte jemand genauer erklären?
    Wenn möglich wie ich das mit den Registern umsetzen kann.

    Danke und Gruß,

    Nicky



  • Benutze GetAddrInfo().



  • Hallo nochmal,

    auch wenns wenige interessiert 🙂

    habe die Nacht noch ein paar Versuche unternommen und meine IP erhalten.

    h_list zeigt auf eine 32bit Speicherstelle, den Wert von dort nach EBX kopieren.
    Anschließend 8 Byte addieren (warum auch immer!!!), nun hat man den Zeiger
    auf die 32bit Adresse mit der IP.
    Nun noch ins Big-Endian-Format und die IP passt.

    mov ebx, offset pc_info.h_list

    mov ebx, [ebx]
    add ebx, 8d
    mov eax, [ebx]
    bswap eax

    bis zum nächsten Problem..

    Nicky



  • Auf solche Tipps würde ich mich nicht verlassen.



  • 314159265358979 schrieb:

    Auf solche Tipps würde ich mich nicht verlassen.

    👍



  • Welche Tipps?



  • Wenn hier schon von Tipps die Rede ist:
    MASM's Default Radix ist 10 - den, zumindest für Außenstehenden, verwirrende 'd'-Suffix kannst du getrost weg lasen. Wenn überhaupt, benutzt man den Suffix 't' (=ten). Die Möglichkeit, die Basis zu ändern, wird, wenn überhaupt, von einigen Marcos gebraucht 😉



  • WinAPI mit Assembler? Ihr Masochisten ey was soll der Sinn davon sein.



  • tips schrieb:

    WinAPI mit Assembler? Ihr Masochisten ey was soll der Sinn davon sein.

    zumindest mit MASM ist der Mehraufwand gegenüber C/C++ gering ⚠ 😉



  • supernicky schrieb:

    Hallo nochmal,

    Anschließend 8 Byte addieren (warum auch immer!!!), nun hat man den Zeiger
    auf die 32bit Adresse mit der IP.

    weil ein Pointer zu einer HOSTENT struktur zurückgegeben wird und die sieht bekanntermassen so aus:

    struct hostent {
        char FAR *       h_name;
        char FAR * FAR * h_aliases;
        short            h_addrtype;
        short            h_length;
        char FAR * FAR * h_addr_list;
    };
    


  • 😑 schrieb:

    supernicky schrieb:

    Hallo nochmal,

    Anschließend 8 Byte addieren (warum auch immer!!!), nun hat man den Zeiger
    auf die 32bit Adresse mit der IP.

    weil ein Pointer zu einer HOSTENT struktur zurückgegeben wird und die sieht bekanntermassen so aus:

    struct hostent {
        char FAR *       h_name;
        char FAR * FAR * h_aliases;
        short            h_addrtype;
        short            h_length;
        char FAR * FAR * h_addr_list;
    };
    

    Hallo,

    und welchen Zusammenhang hat das nun mit den 8 Bytes addieren?
    Kannst du das etwas genauer erklären?

    Nicky



  • Hallo,

    In meiner Winsockanwendung habe ich für den Fall das die Verbindung abgebrochen
    werden soll, ein paar API Aufrufe eingesetzt zum Schließen der einzelnen Handles.

    Hier mal der Code

    invoke shutdown, sock, SD_BOTH
    invoke CloseHandle, thread.thread_empfangen_id
    invoke closesocket, sock
    invoke CloseHandle, sock
    invoke WSACleanup
    ret

    Nach dem die Funktionen abgearbeitet sind, schließt sich meine Anwendung ohne einen Fehler zu melden selbst.

    Die oben genannten Funktionen werden auch nur aufgerufen wenn ein Socket existiert, sonst nicht. Nach dem RET springt er wieder in die Nachrichtenschleife.

    Ist die Reihenfolge eventuell falsch?

    Danke und Gruß,

    Nicky


Anmelden zum Antworten