调用getifaddrs获取ifaddrs实例列表。
枚举此接口返回的ifaddrs列表,直到找到在AF_INET6成员上设置了IFF_LOOPBACK位的ifa_flags适配器。这是您要绑定到的适配器。
现在您有了指向ifaddrs实例的指针,可以将其ifa_addr成员强制转换为(sockaddr_in6*)。将此结构复制到您自己的addr中并设置端口。
下面是一些示例代码:
struct sockaddr_in6 addr = {0};
ifaddrs* pList = NULL;
ifaddrs* pAdapterFound = NULL;
ifaddrs* pAdapter = NULL;
getifaddrs(&pList);
pAdapter = pList;
while (pAdapter)
{
if ((pAdapter->ifa_addr != NULL) &&
(family == pAdapter->ifa_addr->sa_family == AF_INET6) &&
(pAdapter->ifa_flags & IFF_LOOPBACK))
{
pAdapterFound = pAdapter;
break;
}
pAdapter = pAdapter->ifa_next;
}
if (pAdapterFound)
{
// C++ way to copy the sockaddr_in6 struct
addr = *(reinterpret_cast<sockaddr_in6*>(pAdapterFound->ifa_addr)); // C++
// If you are coding in C instead of C++
// memcpy(&addr, pAdapterFound->ifa_addr, sizeof(addr));
addr.sin6_port = htons(0); // or whatever port you want to bind to
}
freeifaddrs(pList);