Konvertieren Sie die IP-Adresse in sockaddr zu uint32_t
Ich bin tyring zu konvertieren IP-Adresse (v4) gespeichert in struct sockaddr
zu uint32_t
.
//struct sockaddr in_addr;
struct sockaddr_in* addr = (struct sockaddr_in*)&in_addr;
uint32_t clientIpAddr = static_cast<uint32_t>(addr->sin_addr.s_addr);
uint16_t clientPortNumber = addr->sin_port;
Ersten Frage ich mich, ob diese überhaupt funktionieren.
Zweiten, ist es besser, konvertieren Sie die IP-Adresse char[4]
und konvertieren, dass zu uint32_t
später?
Dritten, wird die IP-Adresse 0.0.0.1
umgewandelt werden, um die Nummer 1? oder etwas anderes, weil der byte-Reihenfolge?
- Sollten Sie nicht das deklarieren von Variablen als
sockaddr
zu beginnen. Erklären Sie, wiesockaddr_in
(IPv4)sockaddr_in6
(IPv6), oder sockaddr_storage` (IP-gebunden) statt, und dann type-cast Siesockaddr*
bei der Weitergabe an verschiedenen socket-Funktionen (connect()
,accept()
, etc). In jedem Fall extrahiert eine IPv4-Adresse ausin_addr
stellen Sie sicher, dassin_addr.sa_family
ist AF_INET, then a type-cast to
sockaddr_in` ist in Ordnung (Sie brauchen nicht zustatic_cast
dies_addr
Wert, aber Sie solltenreinterpret_cast
auf diein_addr
cast, wenn Sie gehen, um die C++ - casts überhaupt). - Ich danke Ihnen sehr! 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wird es funktionieren, ja.
Laut die Dokumentation,
struct in_addr
ist wie folgt definiert:also ja, können Sie es zu einem uint32_t (und Sie nicht sogar brauchen, um Sie zu wirken).
"In network-byte-order" bit in der Tat sagt uns auch, dass, wenn Sie diese auf einem Computer ist nicht big-endian, werden Sie am Ende mit Müll. Übergeben werden soll es durch
ntohl()
zu beheben.Dieser Umstellung wird die Arbeit in Ordnung, solange Sie nicht versuchen, zu drucken, clientIpAddr, und nur re-verwenden Sie es in Gespräche, um
sendto
oderbind
.Konvertieren die Adresse korrekt ist, müssen Sie verwenden
ntohl
- Funktion, die Sie konvertieren aus dem Netzwerk auf host-byte-order, ansonsten wird Ihr 0.0.0.1-Adresse wird Wert 0x1000000 in clientIpAddr:inet_ntoa()
oderinet_ntop()
oder gleichwertige dafür. Werden Sie öfter arbeiten wollen, die mit der port-Nummer in host-byte-order statt:uint16_t clientPortNumber = ntohs(addr->sin_port);