WOLF 2018 Ответов: 2

Winsocket продолжает отключаться, как только он подключается


Я работаю с DLL для теста, и я продолжаю получать ошибки сокета.

я пытаюсь подключиться к серверу localhost, когда он подключается, я закрываю сервер и хочу, чтобы он продолжал пытаться подключиться, но когда я снова открываю сервер, он продолжает отключаться

bool ISExit = false;
bool Disconnect = false;
void Networking(){
	WSAData data;
	int wsResult = WSAStartup(MAKEWORD(2, 2), &data);
	if (wsResult != 0)
	{
		std::cout << "Can't start Winsock, Err #" << wsResult << std::endl;
		return;
	}

	// Create socket
	SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock == INVALID_SOCKET)
	{
		std::cout << "Can't create socket, Err #" << WSAGetLastError() << std::endl;
		WSACleanup();
		return;
	}

	// Fill in a hint structure
	sockaddr_in hint;
	hint.sin_family = AF_INET;
	hint.sin_port = htons(port);
	inet_pton(AF_INET, ipAddress.c_str(), &hint.sin_addr);

	// Connect to server
	int connResult = connect(sock, (sockaddr*)&hint, sizeof(hint));
	if (connResult == SOCKET_ERROR)
	{
		std::cout << "Can't connect to server, Err #" << WSAGetLastError() << std::endl;
		closesocket(sock);
		WSACleanup();
		return;
	}

	// while loop to send and receive data
	while (!IsExit)
	{
		std::cout << "IsExit = " << std::boolalpha << IsExit << std::endl;
		std::cout << "Disconnect = " << std::boolalpha << Disconnect << std::endl;
		std::string output{ GetData(sock) };
		std::cout << output;
		if (output == "exit\n") {
			IsExit = true;
		}
		if (Disconnect) {
			IsExit = true;
		}
	}

	// Gracefully close down everything
	closesocket(sock);
	WSACleanup();
}

int main(){
    while(true){
        Networking();
    }
}


Что я уже пробовал:

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

верно я верю что проблема здесь
std::string GetData(SOCKET sock) {
	char buf[1024];

	int bytesReceived = recv(sock, buf, 1024, 0);
	if (bytesReceived == SOCKET_ERROR)
		std::cout << "SOCKET ERROR (GETDATA())\n";
		IsExit = true;

	return std::string(buf, 0, bytesReceived);
}

Shao Voon Wong

Что такое консольный вывод? Disconnect может быть установлен в true по умолчанию?

WOLF 2018

disconnect имеет значение false

0x01AA

Как насчет этого IsExit- Я не вижу, чтобы вы инициализировали его на false...

WOLF 2018

ну он установлен на false

боол IsExit = ложь;
хотя (!IsExit)
{
СТД::строка ввода;
std::getline(std::cin, input);
SendData(носок, вход);
std::string output{ GetData(sock) };
с std::соиь <&ЛТ; выход &ЛТ;&ЛТ; функция std::епси;
если (результат == "выход\п") {
IsExit = true;
}
если (отключить) {
IsExit = true;
}
}

0x01AA

Хорошо, я только не вижу этого в коде, который вы разместили в вопросе ;)

0x01AA

Теперь в обновленном коде в вопросе вы все еще не установили IsExit в false, и поэтому при вызове Networking во второй раз он не будет выполнять цикл...

WOLF 2018

это правда, я попробую это сделать

WOLF 2018

хорошо я попробовал добавить это в начале работы в Сети

с

IsExit = false;
Disconnect = false;

и он делает то же самое

2 Ответов

Рейтинг:
4

WOLF 2018

Ладно я нашел проблему

std::string GetData(SOCKET sock) {
	char buf[1024];

	int bytesReceived = recv(sock, buf, 1024, 0);
	if (bytesReceived == SOCKET_ERROR)
		std::cout << "SOCKET ERROR (GETDATA())\n";
		IsExit = true;

	return std::string(buf, 0, bytesReceived);
}


Это работает, когда я чиню {}

std::string GetData(SOCKET sock) {
	char buf[1024];

	int bytesReceived = recv(sock, buf, 1024, 0);
	if (bytesReceived == SOCKET_ERROR) {
		std::cout << "SOCKET ERROR (GETDATA())\n";
		IsExit = true;
	}

	return std::string(buf, 0, bytesReceived);
}


0x0aAA спасибо за помощь


0x01AA

Здорово, что ты смог ее решить. Я не думаю, что я был большой помощью :-)

Рейтинг:
2

0x01AA

Потому что IsExit является ли глобальный (whyever) вам нужно установить его в false каждый раз перед циклом, в противном случае IsExit reamains true после вызова Networking однажды:

...
// while loop to send and receive data
IsExit= false;
while (!IsExit)
{
   ...
}


WOLF 2018

я попробовал это сделать и он все еще делает то же самое

0x01AA

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

WOLF 2018

поскольку это DLL я не могу отладить его в VS 2019

WOLF 2018

вот что я получаю от сервера

Ncat: версия 5.59BETA1 ( http://nmap.org/ncat )
Ncat: прослушивание на 0.0.0.0:3000
Ncat: соединение с 127.0.0.1:53169.
привет
Ncat: версия 5.59BETA1 ( http://nmap.org/ncat )
Ncat: прослушивание на 0.0.0.0:3000
Ncat: соединение с 127.0.0.1:53170.

а на выходе клиент

Не удается подключиться к серверу, Err #10061
Не удается подключиться к серверу, Err #10061
IsExit = false
Disconnect = false
привет
IsExit = false
Disconnect = false
Ошибка сокета (GETDATA()) // это потому, что я отключился

0x01AA

Похоже, я вас неправильно понял, подумал я в первую очередь. Networking был удачный. Так что можете ли вы подтвердить, даже первый запуск Networking терпит неудачу?

WOLF 2018

Ну что ж, так оно и было, но теперь я меняю код, которого больше нет

WOLF 2018

хорошо у меня есть обновление

IsExit = false
привет
Exited Loop // он выходит из цикла