连接函数(winsock2.h)找不到主机

问题描述 投票:0回答:1

我目前正在尝试了解如何使用头文件“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();
c++ windows client c++20 winsock2
1个回答
0
投票

您有以下行定义堆栈上的

port
变量:

PCSTR     port;

但是,在您的

getaddrinfo
调用中使用该值之前,您尚未初始化或稍后将其设置为任何值:

getaddrinfo(host_name, port, &hints, &result)

这个参数,根据getaddrinfo函数(ws2tcpip.h)

[输入,可选] pServiceName

指向以 NULL 结尾的 ANSI 字符串的指针,其中包含表示为字符串的服务名称或端口号。

由于该值很可能不为 NULL,因此该函数将尝试从内存的任意部分读取。这会导致找不到有效的服务名称或端口号,从而导致无法找到主机。

© www.soinside.com 2019 - 2024. All rights reserved.