我知道sockaddr_in用于IPv4,sockaddr_in6用于IPv6.我的困惑是sockaddr和sockaddr_in [6]之间的区别.
有些函数接受sockaddr,有些函数接受sockaddr_in或sockaddr_in6,所以:
>规则是什么?
>为什么需要两种不同的结构?
并且因为sizeof(sockaddr_in6)> sizeof(sockaddr)== sizeof(sockaddr_in).
>这是否意味着如果我们需要支持ipv4和ipv6,我们应该总是使用sockaddr_in6在堆栈中分配内存并转换为sockaddr和sockaddr_in?
一个例子是:我们有一个套接字,我们想得到它的字符串IP地址(它可以是ipv4或ipv6).
我们先调用getsockname来获取一个addr,然后根据addr.sa_family调用inet_ntop.
这段代码片段有什么问题吗?
sockaddr_in6 addr_inv6;
sockaddr* addr = (sockaddr*)&addr_inv6;
sockaddr_in* addr_in = (sockaddr_in*)&addr_inv6;
socklen_t len = sizeof(addr_inv6);
getsockname(_socket, addr, &len);
char ipStr[256];
if (addr->sa_family == AF_INET6)
{
inet_ntop(addr_inv6.sin6_family, &addr_inv6.sin6_addr, ipStr, sizeof(ipStr));
// <<<<<<<
}
else
{
inet_ntop(addr_in->sin_family, &addr_in->sin_addr, ipStr, sizeof(ipStr));
}