要获取 sockaddr_storage
结构中的端口号,需要先将其转换为 sockaddr
结构,然后再根据地址族的不同从相应的字段中获取端口号。以下是一个示例代码:
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
sockaddr_storage addr;
// 假设已经填充了 addr
sockaddr* sa = reinterpret_cast<sockaddr*>(&addr);
if (sa->sa_family == AF_INET) { // IPv4
sockaddr_in* sa_in = reinterpret_cast<sockaddr_in*>(sa);
uint16_t port = ntohs(sa_in->sin_port);
std::cout << "IPv4 端口号: " << port << std::endl;
}
else if (sa->sa_family == AF_INET6) { // IPv6
sockaddr_in6* sa_in6 = reinterpret_cast<sockaddr_in6*>(sa);
uint16_t port = ntohs(sa_in6->sin6_port);
std::cout << "IPv6 端口号: " << port << std::endl;
}
return 0;
}
这段代码可以通过检查地址族(sa_family
)来确定是使用 IPv4 还是 IPv6 地址,并从对应的结构字段中提取出端口号。注意,在提取端口号之前,需要使用 ntohs()
函数将网络字节序转换为主机字节序。
内容由零声教学AI助手提供,问题来源于学员提问