c++ - 如何将套接字绑定(bind)到 ipv6 地址?

标签 c++ server bind ipv6

我正在尝试将 ipv4 应用程序移植到 ipv6,但无法将套接字绑定(bind)到 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

最佳答案

您可以(并且应该)使用getaddrinfo(),而不是手动填充sockaddr_in6相反,让它为您分配一个正确填充的 sockaddr_in6,例如:

int err;

SOCKET listening = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
if (listening == INVALID_SOCKET)
{
    err = WSAGetLastError(); // or errno on non-Windows platforms...
    cerr << "Can't create a socket! Error " << err << ". Quitting" << endl;
    return;
}

// Bind the ip address and port to a socket

addrinfo hint = {};
hint.ai_flags = AI_NUMERICHOST | AI_PASSIVE;
hint.ai_family = AF_INET6;
hint.ai_socktype = SOCK_STREAM;
hint.ai_protocol = IPPROTO_TCP;

addrinfo *res;

err = getaddrinfo("::0", "54000", &hint, &res);
if (err != 0)
{
    cerr << "Can't get address to bind the socket! Error " << err << ". Quitting" << endl;
    closesocket(listening); // or close() on non-Windows platforms...
    return;
}

err = bind(listening, res->ai_addr, res->ai_addrlen);
if (err == SOCKET_ERROR)
{
    err = WSAGetLastError(); // or errno on non-Windows platforms...
    cerr << "Can't bind the socket! Error " << err << ". Quitting" << endl;
    freeaddrinfo(res);
    closesocket(listening); // or close() on non-Windows platforms...
    return;
}

freeaddrinfo(res);

...

关于c++ - 如何将套接字绑定(bind)到 ipv6 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58531087/

相关文章:

c++ - 我如何从模板中的指针获取类型?

curl - ElasticSearch错误-curl:(7)无法连接到localhost:9200;拒绝连接

javascript - 在 Javascript 中将对象原型(prototype)函数绑定(bind)到对象

c++ - Xcode 4 C++ 头文件与另一个头文件的相对路径

c++ - 在 C/C++ 中查找可用的网络接口(interface)?

server - 通过文件客户端连接到远程服务器

sockets - 将 Java gRPC 服务器绑定(bind)到 unix 域套接字

javascript - 使用 forEach() 时如何将参数 'this' 绑定(bind)到数组的每个元素?

c++ - 自动存储时长的具体要求是什么?

javascript - 如何在实时服务器上上传 nodejs 项目或安装 nodejs 和 npm 模块