IPv6 客户端无法连接到 IPv6 服务器



我的程序是客户端-服务器IPv6。客户端无法连接到服务器?客户端和服务器必须使用环回地址该代码中的问题无法连接到服务器

SOCKET sock = socket(AF_INET6, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET)
{
cerr << "Can't create socket, Err #" << WSAGetLastError() << endl;
WSACleanup();
return;
}
sockaddr_in6 hint;
hint.sin6_family = AF_INET6;
hint.sin6_port = htons(port);
hint.sin6_addr = in6addr_any;
// Connect to server
int connResult = connect(sock, (sockaddr*)&hint, sizeof(hint));
if (connResult == SOCKET_ERROR)
{
cerr << "Can't connect to server, Err #" << WSAGetLastError() 
<< endl;
closesocket(sock);
WSACleanup();
return;
}

客户端TCP套接字不能从connect()in6addr_any。TCP服务器可以bind()in6addr_any,因此它可以在具有单个SOCKET的所有可用本地IPv6网络接口上listen()。但是客户端必须将connect()连接到服务器实际侦听的真实IPv6地址(例如,如果客户端与服务器在同一台计算机上运行,则为in6addr_loopback。您的服务器可以使用GetAdaptersInfo()GetAdaptersAddresses()来发现其本地IP地址实际上对客户端的connect()有效(。

此外,还需要将sockaddr_in6结构完全清零。sockaddr_in6具有未填充的sin6_flowinfosin6_scope_id字段,因此它们将具有堆栈中的随机值。sin6_scope_id尤其会影响connect()使用正确网络接口连接到服务器的能力。

SOCKET sock = socket(AF_INET6, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET)
{
cerr << "Can't create socket, Err #" << WSAGetLastError() << endl;
WSACleanup();
return;
}
sockaddr_in6 hint = {};
hint.sin6_family = AF_INET6;
hint.sin6_port = htons(port);
inet_pton(AF_INET6, "server IPv6 address here", &(hint.sin6_addr));
// Connect to server
int connResult = connect(sock, (sockaddr*)&hint, sizeof(hint));
...

请考虑改用getaddrinfo()。让操作系统为您分配一个正确填充的sockaddr_in6,然后您可以按原样将其传递给connect()(类似于我在上一个关于bind()的问题中向您解释的内容(。

addrinfo hint = {};
hint.ai_family = AF_INET6;
hint.ai.socktype = SOCK_STREAM;
hint.ai_protocol = IPPROTO_TCP;
addrinfo *res;
err = getaddrinfo("server hostname or IPv6 address here", "server port here", &hint, &res);
if (err != 0)
{
cerr << "Can't get address to connect, Err #" << WSAGetLastError() << endl;
WSACleanup();
return;
}
SOCKET sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sock == INVALID_SOCKET)
{
cerr << "Can't create socket, Err #" << WSAGetLastError() << endl;
freeaddrinfo(res);
WSACleanup();
return;
}
// Connect to server
int connResult = connect(sock, res->ai_addr, res->ai_addrlen);
if (connResult == SOCKET_ERROR)
{
cerr << "Can't connect to server, Err #" << WSAGetLastError() << endl;
closesocket(sock);
freeaddrinfo(res);
WSACleanup();
return;
}
freeaddrinfo(res);
...

最新更新