我有以下代码列出主机的IP地址。
// 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;
}
问题在于:
cout << ipver << " " << ipstr << endl;
当这一行被执行时,我没有得到任何输出。 但是当我调用ipstr.c_str()时,就像这样:
cout << ipver <<" " << ipstr.c_str() << endl;
我确实得到了输出。
我正在使用GCC 4.8
答案 0 :(得分:2)
你无法修改由std::string::c_str()
返回的缓冲区,并且有一个原因它返回const char *
所以这段代码:
inet_ntop(p->ai_family, addr, const_cast<char*>(ipstr.c_str()), INET6_ADDRSTRLEN);
导致UB。创建一个缓冲区并使用它:
char buffer[INET6_ADDRSTRLEN];
ipstr = inet_ntop(p->ai_family, addr, buffer, INET6_ADDRSTRLEN);