C++ 如何将套接字绑定到ipv6地址?
我正在尝试将ipv4应用程序移植到ipv6,但无法将套接字绑定到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'
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设置为零。然后,请随意将此答案标记为已接受。请参阅。