将 sockaddr 结构体转换为字符串的常用方法是使用 inet_ntop 函数。下面是一个示例代码:
#include <arpa/inet.h>
#include <iostream>
std::string sockaddrToString(const struct sockaddr* sa) {
char addrStr[INET6_ADDRSTRLEN];
if (sa->sa_family == AF_INET) { // IPv4
const struct sockaddr_in* sa_in = reinterpret_cast<const struct sockaddr_in*>(sa);
inet_ntop(AF_INET, &(sa_in->sin_addr), addrStr, INET_ADDRSTRLEN);
return std::string(addrStr);
} else if (sa->sa_family == AF_INET6) { // IPv6
const struct sockaddr_in6* sa_in6 = reinterpret_cast<const struct sockaddr_in6*>(sa);
inet_ntop(AF_INET6, &(sa_in6->sin6_addr), addrStr, INET6_ADDRSTRLEN);
return std::string(addrStr);
}
return "";
}
int main() {
struct sockaddr_storage addr;
// 填充addr结构体,例如:
// memset(&addr, 0, sizeof(addr));
// ((struct sockaddr_in*)&addr)->sin_family = AF_INET;
// ((struct sockaddr_in*)&addr)->sin_port = htons(80);
// inet_pton(AF_INET, "127.0.0.1", &(((struct sockaddr_in*)&addr)->sin_addr));
std::cout << "Address: " << sockaddrToString(reinterpret_cast<struct sockaddr*>(&addr)) << std::endl;
return 0;
}
你可以根据实际情况填充 sockaddr
结构体,并通过调用 sockaddrToString
函数将其转换为字符串表示形式。
内容由零声教学AI助手提供,问题来源于学员提问