c++ connect-function(winsock2.h)找不到主机

rsaldnfx  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(138)

我目前正在尝试了解如何在Windows下使用头文件“winsock2.h”建立服务器-客户端连接。我已经从Microsoft(here)完成了“入门”,现在我有一个问题,我不能解决!
问题是我的程序在函数connect SOCKET_ERROR(WSAGetLastError == 11001 == WSAHOST_NOT_FOUND)(带有“www.google.com“)处返回。
所以我查了一下这里推荐的网站,然后也试了这个(www.contoso.com),结果是一样的。
如果有人能给我解释一下这个问题,我将非常感激!

  1. constexpr auto DEFAULT_PORT = "27015";
  2. constexpr auto DEFAULT_BUFLEN = 512;
  3. #pragma comment(lib, "Ws2_32.lib")
  4. #include <winsock2.h>
  5. #include <ws2tcpip.h>
  6. #include <iostream>
  7. ...
  8. WSADATA wsa_data;
  9. SOCKET sock;
  10. addrinfo* result = NULL;
  11. addrinfo* ptr = NULL;
  12. addrinfo hints{};
  13. PCSTR port = DEFAULT_PORT;
  14. WSAStartup(WINSOCK_VERSION, &wsa_data)
  15. ZeroMemory(&hints, sizeof(hints));
  16. hints.ai_family = AF_INET;
  17. hints.ai_socktype = SOCK_STREAM;
  18. hints.ai_protocol = IPPROTO_TCP;
  19. // Resolve the server address and port
  20. getaddrinfo(host_name, port, &hints, &result)
  21. for (ptr = result; ptr != nullptr; ptr = ptr->ai_next) {
  22. sock = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
  23. if (sock == INVALID_SOCKET) {
  24. std::cout << "\nERROR: socket failed: " << WSAGetLastError() << std::endl;
  25. freeaddrinfo(result);
  26. WSACleanUp();
  27. return WSAGetLastError();
  28. }
  29. if (connect(sock, ptr->ai_addr, (int)ptr->ai_addrlen) == SOCKET_ERROR) {
  30. closesocket(sock);
  31. sock = INVALID_SOCKET;
  32. continue;
  33. }
  34. break;
  35. }
  36. freeaddrinfo(result);
  37. if (sock == INVALID_SOCKET) {
  38. std::cout << "\nERROR: unable to connect to server!\n";
  39. WSACleanUp();
  40. return WSAGetLastError();
  41. }
  42. WSACleanUp();

字符串
编辑:忘记复制端口变量的初始化

d5vmydt9

d5vmydt91#

下面这行代码定义了堆栈上的port变量:

  1. PCSTR port;

字符串
但是,在getaddrinfo调用中使用它之前,您没有初始化或稍后设置该值为任何值:

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


根据getaddrinfo function (ws2tcpip.h),此参数为,
[in,可选] pServiceName
指向以NULL结尾的ANSI字符串的指针,该字符串包含表示为字符串的服务名或端口号。
由于该值很可能不是NULL,因此该函数将尝试从内存的任意部分读取。这将导致找不到有效的服务名称或端口号,从而导致它无法找到主机。

相关问题