我目前正在尝试了解如何在Windows下使用头文件“winsock2.h”建立服务器-客户端连接。我已经从Microsoft(here)完成了“入门”,现在我有一个问题,我不能解决!
问题是我的程序在函数connect SOCKET_ERROR(WSAGetLastError == 11001 == WSAHOST_NOT_FOUND)(带有“www.google.com“)处返回。
所以我查了一下这里推荐的网站,然后也试了这个(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 = DEFAULT_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();
字符串
编辑:忘记复制端口变量的初始化
1条答案
按热度按时间d5vmydt91#
下面这行代码定义了堆栈上的
port
变量:字符串
但是,在
getaddrinfo
调用中使用它之前,您没有初始化或稍后设置该值为任何值:型
根据getaddrinfo function (ws2tcpip.h),此参数为,
[in,可选] pServiceName
指向以NULL结尾的ANSI字符串的指针,该字符串包含表示为字符串的服务名或端口号。
由于该值很可能不是NULL,因此该函数将尝试从内存的任意部分读取。这将导致找不到有效的服务名称或端口号,从而导致它无法找到主机。