#c
#c
Вопрос:
Я создал TCP-сервер (работает на ПК) и клиент (работает на планшете Android). Что-то странное происходит на сервере, когда принимает запрос на подключение.
- Когда я запускаю отладочный, он работает отлично.
- когда я запускаю первый выпуск, он работает, когда я подключаюсь к 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, каждый из них может работать нормально.
но не знаю почему =======