Winsock sockaddr: IP auslesen

sheel

I love Asm
Hi,

kennt wer eine Funktion etc, die mir aus einem sockaddr.sa_data die IP herauslesen kann? Find irgendwie nchts wirklich brauchbares dazu

Danke
Sheel
 
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

wär die Struktur nicht brauchbarer? Da haste extra ne struct für die Addressen und nicht nur n char[14].
Anyways: Nein (:
 
Hallo,

die Struktur sockaddr ist eine allgemeine Struktur die über Protokollgrenzen hinweg Verwaltungsdaten für das spezielle Protokoll speichern kann. Sie fungiert als eine Art Basisstruktur. Je nachdem was du für ein Protokoll verwendest musst du die Variable vom Typ sockaddr auf eine Variable von dem Typ des jeweiligen Protokolls casten.

Für IPv4 bspw. wäre das der Typ sockaddr_in. Danach kannst du dann die Addresse über die Funktion inet_ntoa in ein char Array konvertieren:

C:
struct sockaddr sockdata;
struct sockaddr_in *ipv4sockdata;
char *ip;
/* fill sockdata */
ipv4sockdata = (struct sockaddr_in *) &sockdata

ip = inet_ntoa(ipv4sockdata->sin_addr);

Siehe bitte auch die Dokumentation zu den jeweiligen Datentypen / Funktionen.

HTH,
RedWing
 
Zuletzt bearbeitet:
@Redwing: Einfach casten !? Ich war immer der Meinung, dass das bei verschieden großen Strukturen nichts bringt...Danke, :-)
werd ich ausprobieren

@PoebelundGesocks: Ich kann mir das leider nicht aussuchen, ich krieg die Daten so vorgesetzt und muss was Vernünftiges draus machen...
 
Hallo,
@Redwing: Einfach casten !? Ich war immer der Meinung, dass das bei verschieden großen Strukturen nichts bringt...Danke, :-)
werd ich ausprobieren

Member von Strukturen werden im Speicher linear abgelegt. Gerade dies haben sich die Entwickler der Socket API zunutze gemacht (Es lebe BSD! :)):

Code:
struct sockaddr {
        ushort  sa_family;
        char    sa_data[14];
};
ipv4 Struktur:
Code:
struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};
ipv6 Struktur:
Code:
struct sockaddr_in6 {
        short   sin6_family;
        u_short sin6_port;
        u_long  sin6_flowinfo;
        struct  in6_addr sin6_addr;
        u_long  sin6_scope_id;
};
Du siehst, bis zur sin_family haben diese 3 Strukturen eine gemeinsame Basis. Um Protokolldaten allgemein zur Verfügung stellen zu können gibt es die sockaddr Struktur. Somit ist man quasi protokollunabhängig im Strukturdesign. Nat. werden die Protokolldaten in sa_data in einer protokollabhängige Struktur (ipv4 vs ipv6 bspw.) gespeichert. Damit du nun als Nutzer nicht ewig mit Bitshift- Operationen zu kämpfen hast um die einzelnen Daten zu extrahieren gibt es sockaddr_in6 bzw sockaddr_in. Diese beiden Strukturen sind folglich eine Spezialisierung von sockaddr und bringen Struktur in sa_data. Ein einfacher cast tuts, da dies ja nur für den Compiler eine Rolle spielt, denn der Speicher der dahinter steckt, egal ob nun von sockaddr_in oder sockaddr bspw. ist einförmig dasselbe. Dies gilt zumindest für die ersten 16 Byte der Variablen.

Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken.

Gruß,
RedWing
 
Zurück