So konvertieren Sie Zeichenfolgen in IP-Adressen und umgekehrt
78
Wie kann ich einen String ipAddress (struct in_addr) konvertieren und umgekehrt? und wie gebe ich eine lange IP-Adresse ohne Vorzeichen ein? Vielen Dank
Verwenden Sie inet_ntop()und inet_pton()wenn Sie es anders herum brauchen. Verwenden Sie inet_ntoa(), inet_aton()und ähnliches nicht, da sie veraltet sind und IPv6 nicht unterstützen.
Hier ist eine nette Anleitung mit einigen Beispielen.
// IPv4 demo of inet_ntop() and inet_pton()structsockaddr_insa;char str[INET_ADDRSTRLEN];
// store this IP address in sa:
inet_pton(AF_INET, "192.0.2.33", &(sa.sin_addr));
// now get it back and print it
inet_ntop(AF_INET, &(sa.sin_addr), str, INET_ADDRSTRLEN);
printf("%s\n", str); // prints "192.0.2.33"
Was soll ich tun, um sie unter Windows zu verwenden? Was soll ich einschließen?
Safari
5
Wenn Sie Winsock verwenden, dann InetNtop und InetPton unter Windows Vista und höher. Header-Datei Ws2tcpip.h. Ein Tipp ist, sich Beispiele auf msdn anzusehen.
Mailand
9
WSAAddressToString (ntop) und WSAStringToAddress (pton) in Winsock2.h. Ich würde ein Upgrade auf mindestens Vista vorschlagen und Sie fragen, wann Sie das nächste Mal angeben, welche Plattform Sie entwickeln, wenn Sie Fragen stellen :)
Mailand
2
Dieser Link ist nicht mehr verfügbar
Mars
1
@QiFan Das "n" steht für "Netzwerk" und das "p" für "(Text-) Präsentation".
Als Duplikat markiert
6
Ich bin mir nicht sicher, ob ich die Frage richtig verstanden habe.
Wie auch immer, suchen Sie das:
std::string ip ="192.168.1.54";
std::stringstreams(ip);
int a,b,c,d; //to store the 4 intschar ch; //to temporarily store the '.'
s >> a >> ch >> b >> ch >> c >> ch >> d;
std::cout << a << " " << b << " " << c << " "<< d;
Ich konnte den String mit diesem Code in DWORD und zurück konvertieren:
char strAddr[] = "127.0.0.1"
DWORD ip = inet_addr(strAddr); // ip contains 16777343 [0x0100007f in hex]structin_addrpaddr;
paddr.S_un.S_addr = ip;
char *strAdd2 = inet_ntoa(paddr); // strAdd2 contains the same string as strAdd
Ich arbeite in einem Wartungsprojekt mit altem MFC-Code, daher ist das Konvertieren veralteter Funktionsaufrufe nicht anwendbar.
Die Funktion inet_addr konvertiert eine Zeichenfolge, die eine IPv4-Adresse mit gepunkteten Dezimalstellen enthält, in eine geeignete Adresse für die IN_ADDR-Struktur
PS dies ist das erste Ergebnis, das "in_addr to string" googelt!
Dieses Beispiel zeigt, wie von String zu IP und umgekehrt konvertiert wird:
structsockaddr_insa;char ip_saver[INET_ADDRSTRLEN];
// store this IP address in sa:
inet_pton(AF_INET, "192.0.1.10", &(sa.sin_addr));
// now get it back sprintf(ip_saver, "%s", sa.sin_addr));
// prints "192.0.2.10"printf("%s\n", ip_saver);
Das Hinzufügen des Headers wäre auch schön gewesen
Alexis
0
Hier sind benutzerfreundliche, threadsichere C ++ - Funktionen zum Konvertieren von uint32_t native-endian in Zeichenfolge und Zeichenfolge in native-endian uint32_t:
#include<arpa/inet.h> // inet_ntop & inet_pton#include<string.h> // strerror_r#include<arpa/inet.h> // ntohl & htonlusingnamespacestd; // im lazystringipv4_int_to_string(uint32_t in, bool *const success = nullptr){
stringret(INET_ADDRSTRLEN, '\0');
in = htonl(in);
constbool _success = (NULL != inet_ntop(AF_INET, &in, &ret[0], ret.size()));
if (success)
{
*success = _success;
}
if (_success)
{
ret.pop_back(); // remove null-terminator required by inet_ntop
}
elseif (!success)
{
char buf[200] = {0};
strerror_r(errno, buf, sizeof(buf));
throwstd::runtime_error(string("error converting ipv4 int to string ") + to_string(errno) + string(": ") + string(buf));
}
return ret;
}
// return is native-endian// when an error occurs: if success ptr is given, it's set to false, otherwise a std::runtime_error is thrown.uint32_tipv4_string_to_int(conststring &in, bool *const success = nullptr){
uint32_t ret;
constbool _success = (1 == inet_pton(AF_INET, in.c_str(), &ret));
ret = ntohl(ret);
if (success)
{
*success = _success;
}
elseif (!_success)
{
char buf[200] = {0};
strerror_r(errno, buf, sizeof(buf));
throwstd::runtime_error(string("error converting ipv4 string to int ") + to_string(errno) + string(": ") + string(buf));
}
return ret;
}
Faire Warnung, zum Zeitpunkt des Schreibens sind sie nicht getestet. Aber diese Funktionen sind genau das, wonach ich gesucht habe, als ich zu diesem Thread kam.
Der dritte inet_ptonParameter ist ein Zeiger auf eine in_addrStruktur. Nach einem erfolgreichen inet_ptonAufruf wird die in_addrStruktur mit den Adressinformationen gefüllt. Das S_addrFeld der Struktur enthält die IP-Adresse in Netzwerkbyte-Reihenfolge (umgekehrte Reihenfolge).
Example :
#include<arpa/inet.h>uint32_tNodeIpAddress::getIPv4AddressInteger(std::string IPv4Address){
int result;
uint32_t IPv4Identifier = 0;
structin_addraddr;// store this IP address in sa:
result = inet_pton(AF_INET, IPv4Address.c_str(), &(addr));
if (result == -1) {
gpLogFile->Write(LOGPREFIX, LogFile::LOGLEVEL_ERROR, _T("Failed to convert IP %hs to IPv4 Address. Due to invalid family of %d. WSA Error of %d"), IPv4Address.c_str(), AF_INET, result);
}
elseif (result == 0) {
gpLogFile->Write(LOGPREFIX, LogFile::LOGLEVEL_ERROR, _T("Failed to convert IP %hs to IPv4"), IPv4Address.c_str());
}
else {
IPv4Identifier = ntohl(*((uint32_t *)&(addr)));
}
return IPv4Identifier;
}
Antworten:
Verwenden Sie
inet_ntop()
undinet_pton()
wenn Sie es anders herum brauchen. Verwenden Sieinet_ntoa(), inet_aton()
und ähnliches nicht, da sie veraltet sind und IPv6 nicht unterstützen.Hier ist eine nette Anleitung mit einigen Beispielen.
// IPv4 demo of inet_ntop() and inet_pton() struct sockaddr_in sa; char str[INET_ADDRSTRLEN]; // store this IP address in sa: inet_pton(AF_INET, "192.0.2.33", &(sa.sin_addr)); // now get it back and print it inet_ntop(AF_INET, &(sa.sin_addr), str, INET_ADDRSTRLEN); printf("%s\n", str); // prints "192.0.2.33"
quelle
Ich bin mir nicht sicher, ob ich die Frage richtig verstanden habe.
Wie auch immer, suchen Sie das:
std::string ip ="192.168.1.54"; std::stringstream s(ip); int a,b,c,d; //to store the 4 ints char ch; //to temporarily store the '.' s >> a >> ch >> b >> ch >> c >> ch >> d; std::cout << a << " " << b << " " << c << " "<< d;
Ausgabe:
192 168 1 54
quelle
Ich konnte den String mit diesem Code in DWORD und zurück konvertieren:
char strAddr[] = "127.0.0.1" DWORD ip = inet_addr(strAddr); // ip contains 16777343 [0x0100007f in hex] struct in_addr paddr; paddr.S_un.S_addr = ip; char *strAdd2 = inet_ntoa(paddr); // strAdd2 contains the same string as strAdd
Ich arbeite in einem Wartungsprojekt mit altem MFC-Code, daher ist das Konvertieren veralteter Funktionsaufrufe nicht anwendbar.
quelle
inet_ntoa()
konvertiert ain_addr
in string:inet_addr()
macht den umgekehrten JobPS dies ist das erste Ergebnis, das "in_addr to string" googelt!
quelle
So konvertieren Sie einen String in in-addr:
So konvertieren Sie in_addr in einen String:
char saddr[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &inaddr, saddr, INET_ADDRSTRLEN);
quelle
Dieses Beispiel zeigt, wie von String zu IP und umgekehrt konvertiert wird:
struct sockaddr_in sa; char ip_saver[INET_ADDRSTRLEN]; // store this IP address in sa: inet_pton(AF_INET, "192.0.1.10", &(sa.sin_addr)); // now get it back sprintf(ip_saver, "%s", sa.sin_addr)); // prints "192.0.2.10" printf("%s\n", ip_saver);
quelle
Hier sind benutzerfreundliche, threadsichere C ++ - Funktionen zum Konvertieren von uint32_t native-endian in Zeichenfolge und Zeichenfolge in native-endian uint32_t:
#include <arpa/inet.h> // inet_ntop & inet_pton #include <string.h> // strerror_r #include <arpa/inet.h> // ntohl & htonl using namespace std; // im lazy string ipv4_int_to_string(uint32_t in, bool *const success = nullptr) { string ret(INET_ADDRSTRLEN, '\0'); in = htonl(in); const bool _success = (NULL != inet_ntop(AF_INET, &in, &ret[0], ret.size())); if (success) { *success = _success; } if (_success) { ret.pop_back(); // remove null-terminator required by inet_ntop } else if (!success) { char buf[200] = {0}; strerror_r(errno, buf, sizeof(buf)); throw std::runtime_error(string("error converting ipv4 int to string ") + to_string(errno) + string(": ") + string(buf)); } return ret; } // return is native-endian // when an error occurs: if success ptr is given, it's set to false, otherwise a std::runtime_error is thrown. uint32_t ipv4_string_to_int(const string &in, bool *const success = nullptr) { uint32_t ret; const bool _success = (1 == inet_pton(AF_INET, in.c_str(), &ret)); ret = ntohl(ret); if (success) { *success = _success; } else if (!_success) { char buf[200] = {0}; strerror_r(errno, buf, sizeof(buf)); throw std::runtime_error(string("error converting ipv4 string to int ") + to_string(errno) + string(": ") + string(buf)); } return ret; }
Faire Warnung, zum Zeitpunkt des Schreibens sind sie nicht getestet. Aber diese Funktionen sind genau das, wonach ich gesucht habe, als ich zu diesem Thread kam.
quelle
Der dritte
inet_pton
Parameter ist ein Zeiger auf einein_addr
Struktur. Nach einem erfolgreicheninet_pton
Aufruf wird diein_addr
Struktur mit den Adressinformationen gefüllt. DasS_addr
Feld der Struktur enthält die IP-Adresse in Netzwerkbyte-Reihenfolge (umgekehrte Reihenfolge).Example : #include <arpa/inet.h> uint32_t NodeIpAddress::getIPv4AddressInteger(std::string IPv4Address) { int result; uint32_t IPv4Identifier = 0; struct in_addr addr; // store this IP address in sa: result = inet_pton(AF_INET, IPv4Address.c_str(), &(addr)); if (result == -1) { gpLogFile->Write(LOGPREFIX, LogFile::LOGLEVEL_ERROR, _T("Failed to convert IP %hs to IPv4 Address. Due to invalid family of %d. WSA Error of %d"), IPv4Address.c_str(), AF_INET, result); } else if (result == 0) { gpLogFile->Write(LOGPREFIX, LogFile::LOGLEVEL_ERROR, _T("Failed to convert IP %hs to IPv4"), IPv4Address.c_str()); } else { IPv4Identifier = ntohl(*((uint32_t *)&(addr))); } return IPv4Identifier; }
quelle
Hexadezimale IP-Adresse zu String-IP
#include <iostream> #include <sstream> using namespace std; int main() { uint32_t ip = 0x0AA40001; string ip_str=""; int temp = 0; for (int i = 0; i < 8; i++){ if (i % 2 == 0) { temp += ip & 15; ip = ip >> 4; } else { stringstream ss; temp += (ip & 15) * 16; ip = ip >> 4; ss << temp; ip_str = ss.str()+"." + ip_str; temp = 0; } } ip_str.pop_back(); cout << ip_str; }
Ausgabe: 10.164.0.1
quelle