2016-07-19 34 views
0

Ich lerne Networking in c durch Blick auf den Code eines funktionierenden Paket-Sniffer innerhalb von Microsoft Visual Basic 2013.Untersuchen von C-Header-Dateien Weitere

Im Folgenden finden Sie Code, der einen Zeiger auf eine hostent Struktur schafft, erhält die localhost Hostnamen, und lädt es in den hostent Strukturlokalen genannt.

Der nächste Teil ermöglicht das Drucken der Adresse in Dezimalschreibweise.

for (i = 0; local->h_addr_list[i] != 0; ++i) 
{ 
    memcpy(&addr, local->h_addr_list[i], sizeof(struct in_addr)); 
    printf(" Interface Number : %d Address : %s\n",i,inet_ntoa(addr)); 
} 

Nun möchte ich verstehen, wie das alles funktioniert und mehr. . .

Say I inet_ntoa verstehen wollen(), ich mit der rechten Maustaste und Zur Definition oder Go To Erklärung und sendet sie mir zu Winsock2.h, die zeigt, gehen wählen:

inet_ntoa(
    __in struct in_addr in 
); 

Dies scheint zu sein, zeigen Sie mir den Parameter, aber nicht die Funktionsweise der Funktion oder den Rückgabewert. Das bedeutet, dass ich mich auf die MSDN beziehen muss, um zu verstehen, was jedes Mal passiert.

Meine Frage ist: Wo ist der Code zu lesen, was passiert, so muss ich nicht die Dokumente verwenden?

z. Wo ist der inet_ntoa Funktionsinhalt?

+3

'inet_ntoa' in einem System-DLL implementiert, speziell' Ws2_32.dll'. Es ist keine Microsoft-Quelle verfügbar. Sie können Open-Source-Implementierungen finden, die für andere Plattformen verfügbar sind. Linux Dokumentation ist hier http://linux.die.net/man/3/inet_ntoa –

+3

Dies ist in vielen [tag: c] Bibliotheken implementiert, zum Beispiel * glibc * implementiert es und Sie können es Code lesen, da Sie die herunterladen können ganz * glibc *. Es ist in Headerdateien nicht implementiert. –

+0

Ist das ein _full_ Zitat von WinSock2.h? Weil die Funktionsdeklaration keinen Rückgabetyp zu haben scheint, der überhaupt nicht funktionieren sollte. –

Antwort

3

Sie sind hier:

#include <stdio.h> 
#include <stdlib.h> 
#include <arpa/inet.h> 

/* The interface of this function is completely stupid, it requires a 
    static buffer. We relax this a bit in that we allow one buffer for 
    each thread. */ 

static __thread char buffer[18]; 

char *inet_ntoa (struct in_addr in) 
{ 
    unsigned char *bytes = (unsigned char *) &in; 
    __snprintf (buffer, sizeof (buffer), "%d.%d.%d.%d", 
       bytes[0], bytes[1], bytes[2], bytes[3]); 

    return buffer; 
} 

Entnommen inet_ntoa.c, glibc 2.23

Denken Sie daran, dass die glibc Open Source ist, wenn Sie also ein wenig zu erkunden und lerne, was unter der Haube passiert, zögere nicht und lade es herunter!

Grüße

+0

Vielen Dank für die Antwort kaufen, wie finde ich, wo das liegt? – Phoenix

+2

@Phoenix Sie können den * glibc * Code herunterladen und dann etwas wie 'finden. -type f -name '* .c' -exec grep -nH --color "inet_ntoa" {} \; 'aus dem Stammverzeichnis des Codes. Dann können Sie herausfinden, wo es implementiert ist. –

+3

Es ist besser, einen Live-Link zur Quelle bereitzustellen: https://sourceware.org/git/?p=glibc.git;a=blob;f=inet/inet_ntoa.c; hb = HEAD (nicht, dass ich erwarte, dass sich dies viel ändert: P ... auch, witziger Kommentar) –