2016-04-09 12 views
1

Ich habe den folgenden Code zum Auflisten der IP-Adresse eines Hosts.Ausgabe mit Std :: String

// Loop through all the linked list of address and get the ip addresses 
for(p = res; p != NULL; p = p->ai_next){ 
    void *addr; 
    string ipver; 

    if(p->ai_family == AF_INET){ 
     // IPv4 address 
     sockaddr_in *ipv4 = (sockaddr_in*)p->ai_addr; 
     addr = &(ipv4->sin_addr); 
     ipver = "IPv4"; 
    } 
    else{ 
     // IPv6 address 
     sockaddr_in6 *ipv6 = (sockaddr_in6*)p->ai_addr; 
     addr = &(ipv6->sin6_addr); 
     ipver = "IPv6"; 
    } 

    // use INET6_ADDRSTRLEN becuase we need it to big enough 
    // convert the ip from network(bits) to presentation(eg. 127.0.0.1) 
    inet_ntop(p->ai_family, addr, const_cast<char*>(ipstr.c_str()), INET6_ADDRSTRLEN); 
    // print it out 
    cout << ipver <<" " << ipstr << endl; 
} 

Das Problem ist, mit:

cout << ipver << " " << ipstr << endl; 

Wenn diese Zeile bekomme ich keine Ausgabe ausgeführt wird. Aber wenn ich ipstr.c_str() wie folgt aufrufen:

cout << ipver <<" " << ipstr.c_str() << endl; 

ich Ausganges.

Ich bin mit GCC 4.8

+0

Wo wurde 'ipstr' deklariert? – timrau

+0

'const_cast (ipstr.c_str())' - yikes. Wenn Sie sich dabei befinden (indem Sie const_cast verwenden), hören Sie auf und denken Sie darüber nach, was Sie tun. Es ist sehr wahrscheinlich, dass es das Falsche ist. –

+0

@timrau es als std :: string deklariert, aber ich habe es nicht –

Antwort

2

Sie können nicht Puffer ändern, zurückgegeben von std::string::c_str() und es gibt einen Grund, warum es const char * so diesen Code zurückgibt:

inet_ntop(p->ai_family, addr, const_cast<char*>(ipstr.c_str()), INET6_ADDRSTRLEN); 

führt zu UB. erstelle einen Puffer und benutze ihn:

char buffer[INET6_ADDRSTRLEN]; 
ipstr = inet_ntop(p->ai_family, addr, buffer, INET6_ADDRSTRLEN); 
+0

Vielen Dank. Problem gelöst. –

Verwandte Themen