我目前正在尝试了解如何使用头文件“winsock2.h”在Windows下建立服务器-客户端连接。我已经完成了 Microsoft 的“入门”(此处),但现在我遇到了无法解决的问题!
问题是我的程序在函数 connect SOCKET_ERROR (WSAGetLastError == 11001 == WSAHOST_NOT_FOUND) (带有“www.google.com”)处返回。
所以我查找了建议的网站类型here,然后也尝试了这个(www.contoso.com),得到了相同的结果
如果有人能向我解释这个问题,我将非常感激!
constexpr auto DEFAULT_PORT = "27015";
constexpr auto DEFAULT_BUFLEN = 512;
#pragma comment(lib, "Ws2_32.lib")
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
...
WSADATA wsa_data;
SOCKET sock;
addrinfo* result = NULL;
addrinfo* ptr = NULL;
addrinfo hints{};
PCSTR port;
WSAStartup(WINSOCK_VERSION, &wsa_data)
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
// Resolve the server address and port
getaddrinfo(host_name, port, &hints, &result)
for (ptr = result; ptr != nullptr; ptr = ptr->ai_next) {
sock = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
if (sock == INVALID_SOCKET) {
std::cout << "\nERROR: socket failed: " << WSAGetLastError() << std::endl;
freeaddrinfo(result);
WSACleanUp();
return WSAGetLastError();
}
if (connect(sock, ptr->ai_addr, (int)ptr->ai_addrlen) == SOCKET_ERROR) {
closesocket(sock);
sock = INVALID_SOCKET;
continue;
}
break;
}
freeaddrinfo(result);
if (sock == INVALID_SOCKET) {
std::cout << "\nERROR: unable to connect to server!\n";
WSACleanUp();
return WSAGetLastError();
}
WSACleanUp();
您有以下行定义堆栈上的
port
变量:
PCSTR port;
但是,在您的
getaddrinfo
调用中使用该值之前,您尚未初始化或稍后将其设置为任何值:
getaddrinfo(host_name, port, &hints, &result)
这个参数,根据getaddrinfo函数(ws2tcpip.h),
[输入,可选] pServiceName
指向以 NULL 结尾的 ANSI 字符串的指针,其中包含表示为字符串的服务名称或端口号。
由于该值很可能不为 NULL,因此该函数将尝试从内存的任意部分读取。这会导致找不到有效的服务名称或端口号,从而导致无法找到主机。