Прослушиватель сокетов C accept () не принял запрос на подключение при выпуске

#c

#c

Вопрос:

Я создал TCP-сервер (работает на ПК) и клиент (работает на планшете Android). Что-то странное происходит на сервере, когда принимает запрос на подключение.

  1. Когда я запускаю отладочный, он работает отлично.
  2. когда я запускаю первый выпуск, он работает, когда я подключаюсь к Wi-Fi, на котором я был, пока я его кодировал. но когда я сменил Wifi (потому что мне нужно разместить свой серверный компьютер в другом месте), сервер не перехватил мой запрос на подключение.

я использовал wireshark и подтвердил, что запрос прибыл на мой серверный компьютер. порт назначения — 9090. а также проверил netstat, подтвердил, что мой порт 9090 будет открыт моим приложением. Я целый день искал в Интернете и не нашел никаких соответствующих ответов. у вас могут быть какие-либо предложения? Заранее спасибо.

Вот мой серверный код.

 int StartServer() {
  WSADATA wsaData;
  int iResu<

  struct addrinfo * result = NULL;
  struct addrinfo hints;

  int iSendResu<
  char recvbuf[DEFAULT_BUFLEN];
  int recvbuflen = DEFAULT_BUFLEN;

  // Initialize Winsock
  iResult = WSAStartup(MAKEWORD(2, 2), amp; wsaData);
  if (iResult != 0) {
    printf("WSAStartup failed with error: %dn", iResult);
    return 1;
  }

  ZeroMemory( amp; 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 server address and port
  iResult = getaddrinfo(NULL, DEFAULT_PORT, amp; hints, amp; result);
  if (iResult != 0) {
    printf("getaddrinfo failed with error: %dn", iResult);
    WSACleanup();
    return 1;
  }

  // Create a SOCKET for connecting to server
  listenSocket = socket(result - > ai_family, result - > ai_socktype, result - > ai_protocol);
  if (listenSocket == INVALID_SOCKET) {
    printf("socket failed with error: %ldn", WSAGetLastError());
    freeaddrinfo(result);
    WSACleanup();
    return 1;
  }

  // Setup the TCP listening socket
  iResult = bind(listenSocket, result - > ai_addr, (int) result - > ai_addrlen);
  if (iResult == SOCKET_ERROR) {
    printf("bind failed with error: %dn", WSAGetLastError());
    freeaddrinfo(result);
    closesocket(listenSocket);
    WSACleanup();
    return 1;
  }

  freeaddrinfo(result);

  iResult = listen(listenSocket, SOMAXCONN);
  if (iResult == SOCKET_ERROR) {
    printf("listen failed with error: %dn", WSAGetLastError());
    closesocket(listenSocket);
    WSACleanup();
    return 1;
  }
  return 0;
}
  

При выполнении основной функции:

 //start the server
if ((ret = StartServer()) > 0)
{
    cout << "Start server failed!" << endl;
    cin >> ret;
    return 0;
}
    cout << "*************************************" << endl;
    cout << "waiting for connection" << endl; 
    SOCKET clientSocket = INVALID_SOCKET;//create client socket
    clientSocket = accept(listenSocket, NULL, NULL); 
    cout << "connection confirmed!" << endl;
  

Комментарии:

1. Вы bind подключаете слушающий сокет к определенному IP-адресу. Вероятно, соединение поступает по другому адресу. Вместо этого попробуйте привязку к INADDR_ANY , чтобы прослушивать все адаптеры.

2. Пожалуйста, правильно отформатируйте этот неразборчивый беспорядок.

3. @IgorTandetnik , большое спасибо за ваш комментарий. я проверил netstat -ano, TCP 0.0.0.0: 9090 0.0.0.0:0 ПРОСЛУШИВАНИЕ 11952 существует в списке. итак, я думаю, что сейчас я слушаю 0.0.0.0: 9090, верно?

Ответ №1:

я, наконец, решил проблему. но не понимаю, почему!

я скопировал свой исходный код в новый проект и установил настройки, как я делал раньше. и когда я выпустил этот, это сработало!

я тестировал на нескольких разных Wifi, каждый из них может работать нормально.

но не знаю почему =======