【问题标题】:winsock server not accepting connectionswinsock 服务器不接受连接
【发布时间】:2019-10-08 18:01:58
【问题描述】:

我有一个不接受任何连接的简单 TCP 服务器应用程序。 它目前是使用 vs 2019 构建的,但最初是使用 vs 2012 构建的(不久前)。 原始版本有效,但 2019 版本从不接受。 我可以研究哪些领域? 我无权访问客户端代码。 这是我的服务器代码

  int iResult;
   WSADATA wsaData;
   // Initialize Winsock
   iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
   if (iResult != 0) {
      printf("WSAStartup failed: %d\n", iResult);
      return 1;
   }
#define DEFAULT_PORT "8082"

   struct addrinfo* result = NULL, * ptr = NULL, hints;

   ZeroMemory(&hints, sizeof(hints));
   hints.ai_family = AF_INET;
   hints.ai_socktype = SOCK_STREAM;
   hints.ai_protocol = IPPROTO_TCP;
   hints.ai_flags = AI_PASSIVE;

   // Resolve the local address and port to be used by the server
   iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
   if (iResult != 0) {
      printf("getaddrinfo failed: %d\n", iResult);
      WSACleanup();
      return 1;
   }

   SOCKET ListenSocket = INVALID_SOCKET;

   ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);

   if (ListenSocket == INVALID_SOCKET) {
      printf("Error at socket(): %ld\n", WSAGetLastError());
      freeaddrinfo(result);
      WSACleanup();
      return 1;
   }

   iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
   if (iResult == SOCKET_ERROR) {
      printf("bind failed with error: %d\n", WSAGetLastError());
      freeaddrinfo(result);
      closesocket(ListenSocket);
      WSACleanup();
      return 1;
   }
   printf("bound\n");
   if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR) {
      printf("Listen failed with error: %ld\n", WSAGetLastError());
      closesocket(ListenSocket);
      WSACleanup();
      return 1;
   }

   SOCKET ClientSocket;

   ClientSocket = INVALID_SOCKET;

   // Accept a client socket
   ClientSocket = accept(ListenSocket, NULL, NULL);
   if (ClientSocket == INVALID_SOCKET) {
      printf("accept failed: %d\n", WSAGetLastError());
      closesocket(ListenSocket);
      WSACleanup();
      return 1;
   }

   printf("connected\n");

这是wireshark的输出

这是来自 netsat

【问题讨论】:

  • 您是否遇到任何错误,如果有,是什么?
  • 你绑定的是什么地址和端口?
  • 没有错误 - 只是等待连接
  • @Gunner 显示的代码很好,只要打开一个监听套接字并接受它的连接。问题必须与客户端未连接到正确的 IP/端口有关。另一方面,此代码仅创建 1 个侦听套接字,但 getaddrinfo() 返回地址链表,因此链表可能包含多个本地 IP 地址(您没有t 检查)并且客户端正在尝试连接到您根本没有为其创建侦听套接字的 IP。 netstat 的输出实际上说了什么,Wireshark 实际显示了什么?
  • @o_weisman 这是永远不会获得连接的接受

标签: c++ winsock


【解决方案1】:

发现问题 是防火墙阻止了连接请求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多