我的程序是客户端服务器IPv6。客户端无法建立与服务器的连接?客户端和服务器必须使用回送地址 这段代码中的问题无法连接到服务器
Propagation.REQUIRED
答案 0 :(得分:0)
客户端TCP套接字不能从connect()
到in6addr_any
。 TCP服务器可以bind()
到in6addr_any
,因此可以使用单个listen()
在所有可用的本地IPv6网络接口上SOCKET
。但是客户端必须connect()
到服务器实际侦听的真实IPv6地址(例如in6addr_loopback
,如果客户端与服务器在同一台计算机上运行。您的服务器可以使用{{1} }或GetAdaptersInfo()
来发现其本地IP地址实际上是什么对客户端GetAdaptersAddresses()
而言是有效的)。
此外,您需要将connect()
结构完全归零。 sockaddr_in6
包含您没有填充的sockaddr_in6
和sin6_flowinfo
字段,因此它们将具有来自堆栈的随机值。 sin6_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
(类似于我在您的previous question中为{{1} }。
connect()