2010-12-16 8 views
3

in meiner C++ Anwendung Ich benutze sockaddr. Ich möchte alle Informationen sehen, die sockaddr.sa_data [14] enthält. für den Moment drucke ich nur die IP von sa_data [2] .sa_data [3] .sa_data [4] .sa_data [5].sockaddr - drucke alle Informationen, die sa_data enthält - C++

Ich möchte so drucken, dass ich alle Informationen in den sa_data 14 Bytes verstehen (und bitte erläutern) kann.

Hilfe?

danke!

Antwort

1

Eine Möglichkeit wäre, inet_ntop zu verwenden, die IPv4- und IPv6-Adressen verarbeiten können sollte. Es wird eine für Menschen lesbare Zeichenfolge mit der Adresse erzeugt.

0
std::copy(&sa_data[0], &sa_data[0]+sizeof(sa_data)/sizeof(sa_data[0]), 
      std::ostream_iterator<int>(std::cout, " ")); 

wird jedes Element als ein int mit einem Leerzeichen getrennt gedruckt. Sie können auch unsigned int verwenden, wenn Sie keine negativen Werte wünschen, und Sie können Ihren Stream dazu verwenden, hexen zu drucken, wenn Sie das bevorzugen.

0

Die Informationen in sockaddr hängt davon ab, welche Socket-Familie und welches Protokoll Sie verwenden. Wenn Sie IPv4 verwenden, müssen Sie den Zeiger sockaddr auf sockaddr_in * umwandeln. Nur die ersten 6 Byte der Adresse sind sinnvoll, wenn Sie IPv4 verwenden. Der Rest sollte einfach ignoriert werden.

5

Im sa_data-Mitglied für IPv4 unter Windows habe ich festgestellt, dass die ersten beiden Bytes die Portnummer enthalten und die nächsten vier die IP-Adresse.

Zum Beispiel, wenn ich die Adresse 228.0.0.1:9995 zu beheben, das sa_data Mitglied ist ...

27 0b e4 00 00 01 00 00 00 00 00 00 00 00 

Hier ist 270b die Hex-Wert-Darstellung von 9995 in den ersten beiden Bytes. Die nächsten vier Bytes sind die IP-Adresse, wobei 0xe4 228 ist, dann zwei Nullen, dann 0x01 oder 228 0 0 1.
Die letzten acht Bytes sind unbenutzt, was mit dem obigen Kommentar überein- stimmt, dass nur die ersten sechs Bytes verwendet werden .

Beachten Sie, dass sa_data im Format mit dem verwendeten Protokoll variieren wird.

+0

Dank, das half mir sehr viel zu bekommen und drucken – waza123

1

Der Wert der sa_data, die 14 Bytes beträgt, wird basierend auf der Adressfamilie geändert: sa_family.

  1. Wenn die Adressfamilie AF_INET ist, sind die ersten beiden Bytes die Portnummer und die nächsten 4 Bytes die Quell-IP-Adresse.

  2. Wenn die Adressfamilie PF_PACKET ist, geben die ersten zwei Bytes den Ethernet-Typ an (Wither 0800 -> IP, 0806 -> ARP etc ..) und die nächsten 4 Bytes (eigentlich reicht der erste) es teilt der Quellschnittstelle mit. wenn der Wert:

    • 02 00 00 00 = eth0,
    • 03 00 00 00 = eth1,
    • 04 00 00 00 = eth2 etc ... und das letzte 8 Bytes ungenutzt in AF_INET Familie, aber in der PF_PACKET habe ich nicht herausgefunden.
Verwandte Themen