c++ - 如何将套接字绑定到 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'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
解决方案
而不是sockaddr_in6
手动填充,您可以(并且应该)使用getaddrinfo()
并让它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);
...
推荐阅读
- regex - CMake 文件命令给出“无效的转义序列 \。” 对于正则表达式规则
- java - 为什么我的平均值没有按应有的方式打印出来?
- javascript - 当 javascript getTime() 超过最大 int 时会发生什么?
- android - Kotlin Dagger 模块未设置
- powershell - powershell -C measure-command 带引号的字符串,其中手动转义是不可能的
- angular - 当前组件中不存在指令
- react-native - React-native IOS [网络请求失败]
- java - 这个 UML 类图的实现会是什么样子?
- c++ - C++:分段错误,malloc.c:没有这样的文件或目录
- ruby - RVM 移动路径 Selenium - Chromedriver