首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IPv6环回地址的sin6_scope_id是什么?

IPv6环回地址的sin6_scope_id是什么?
EN

Stack Overflow用户
提问于 2019-10-29 08:26:47
回答 1查看 1.3K关注 0票数 0

我想创建一个绑定到本地机器上任何端口的套接字,这样我就可以在Windows上模拟socketpair()了。当我希望这个套接字为IPv6时,我应该为sin6_scope_id设置什么值?我真的需要枚举适配器并找到环回适配器才能填写该字段吗?

换句话说,为了绑定到任何本地端口,我需要对此做些什么?

代码语言:javascript
运行
复制
struct sockaddr_in6 addr;
addr.sin6_family = AF_INET6;
addr.sin6_port = htons(0);
addr.sin6_flowinfo = 0;
addr.sin6_addr = in6addr_loopback;
addr.sin6_scope_id = ????;
EN

回答 1

Stack Overflow用户

发布于 2019-10-29 08:49:09

一些套接字专家可能知道设置它的直接方法。但更简单的方法是直接向系统查询它。这将为您正确地设置"flowinfo“和"scope_id”。

一般方法是这样的:

调用getifaddrs获取ifaddrs实例列表。

枚举此接口返回的ifaddrs列表,直到找到在AF_INET6成员上设置了IFF_LOOPBACK位的ifa_flags适配器。这是您要绑定到的适配器。

现在您有了指向ifaddrs实例的指针,可以将其ifa_addr成员强制转换为(sockaddr_in6*)。将此结构复制到您自己的addr中并设置端口。

下面是一些示例代码:

代码语言:javascript
运行
复制
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);

欢迎您引用我称为GetSocketAddressForAdapter的帮助器函数。您可以按如下方式调用它:

代码语言:javascript
运行
复制
GetSocketAddressforAdapter(AF_INET6, "::1", 0, &address);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58600024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档