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

Safari
quelle
1
WSAAddressToString und WSAStringToAddress
Andrew

Antworten:

147

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()

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"
Mailand
quelle
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::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
Nawaz
quelle
4

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.

Zac
quelle
2

inet_ntoa()konvertiert a in_addrin string:

Die Funktion inet_ntoa konvertiert eine (Ipv4) Internet-Netzwerkadresse in eine ASCII-Zeichenfolge im Internet-Standard-Punkt-Dezimal-Format.

inet_addr() macht den umgekehrten Job

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!

CharlesB
quelle
8
Diese Funktionen sind veraltet und sollten nicht verwendet werden.
Mailand
1
@Milan OK. Obwohl das OP in_addr struct verwendet, die sich mit ipv4 befassen
CharlesB
Was soll ich tun, um sie unter Windows zu verwenden? Was soll ich einschließen?
Safari
Die Antwort finden Sie in der Dokumentation der Funktion (folgen Sie dem Link): include Winsock2.h.
CharlesB
2

So konvertieren Sie einen String in in-addr:

in_addr maskAddr;
inet_aton(netMaskStr, &maskAddr);

So konvertieren Sie in_addr in einen String:

char saddr[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &inaddr, saddr, INET_ADDRSTRLEN);
Krit
quelle
1

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); 
William Cuervo
quelle
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 & 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.

hanshenrik
quelle
0

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_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;
}
Sourabh Bhardwaj
quelle
-1

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

Wang Aoyu
quelle