C++ 如何将套接字绑定到ipv6地址?

C++ 如何将套接字绑定到ipv6地址?,c++,server,bind,ipv6,C++,Server,Bind,Ipv6,我正在尝试将ipv4应用程序移植到ipv6,但无法将套接字绑定到ipv6地址 问题在于: err=bind(listening, (sockaddr*)&hint, sizeof(hint)); err应为0,但在此代码中返回-1。出什么事了 SOCKET listening = socket(AF_INET6, SOCK_STREAM, 0); if (listening == INVALID_SOCKET) { cerr << "Can'

我正在尝试将ipv4应用程序移植到ipv6,但无法将套接字绑定到ipv6地址

问题在于:

err=bind(listening, (sockaddr*)&hint, sizeof(hint));
err
应为0,但在此代码中返回-1。出什么事了

SOCKET listening = socket(AF_INET6, SOCK_STREAM, 0);
    if (listening == INVALID_SOCKET)
    {
        cerr << "Can't create a socket! Quitting" << endl;
        return;
    }
    int err;
    // Bind the ip address and port to a socket
    sockaddr_in6 hint;
    hint.sin6_family = AF_INET6;
    hint.sin6_flowinfo = 0;
    hint.sin6_port = htons(54000);
    hint.sin6_addr = in6addr_any;
    err=bind(listening, (sockaddr*)&hint, sizeof(hint)); //<======= here
SOCKET监听=SOCKET(AF_INET6,SOCK_流,0);
if(侦听==无效的\u套接字)
{

cerr这可能取决于您的平台,但在Linux 2.4上,由于
sockaddr\u in6
结构还包含一个
sin6\u scope\u id
成员,用于定义IPv6作用域,并且由于变量
hint
位于堆栈上,因此其中包含随机数据

IPv6范围描述了它是什么类型的地址:单播、多播、本地链接和其他一些地址,我对它们只有一点驾车知识。但是如果其中有垃圾,它可能是一种东西

建议通过将
sin6\u scope\u id
硬设置为零来排除这一问题,或者(更好)在分配内容之前将整个
sockaddr\u in6
结构归零;我长期以来一直使用
sockaddr\u in
变量来解决这一问题,只是为了确保我不会得到我不想要的垃圾

memset(&hint, 0, sizeof hint);

是的,
errno
非常重要。

您可以(也应该)使用,而不是手动填充
sockaddr\u in6
,让它为您分配一个正确填充的
sockaddr\u in6
,例如:

int-err;
套接字侦听=套接字(AF_INET6、SOCK_流、IPPROTO_TCP);
if(侦听==无效的\u套接字)
{
err=WSAGetLastError();//或非Windows平台上的errno。。。

cerr将
errno
设置为什么?(提示:使用
perror()
strerror()
获得一条清晰易读的错误消息)或者可以使用结构初始化来代替memset设置为零。然后,请随意将此答案标记为已接受。请参阅。