@Sazoks

При завершении потока кидает ошибку?

Есть у меня клиент-серверная апликуха. Клиент набирает какие-то команды, они отправляются на сервер и далее обрабатываются этой функцией:
void Server::ClientThread(SOCKET ClientConn)
{
	int ID = -1, r;	
	char Func[32];
        std::map<std::string, void(Server::*)(SOCKET, int)>::iterator It;
	while ((r = recv(ClientConn, Func, sizeof(Func) - 1, NULL)) != -1 && r != 0)
              if ((It = Functions.find(Func)) != Functions.end())
                    (this->*It->second)(ClientConn, ID);
	std::cout << "Client disconnected\n";
	if (ID != -1) DeleteUser(ID);
}

Функция выше запускается в новом потоке при каждом новом подключении.
Недавно я обнаружил, что поток завершается с ошибкой! Из-за этого программа иногда ведет себя странно..
При выходе из этой функции, а значит, и при завершении потока, выскакивает ошибка "символы не загружены _здесь название файла_". Ну первое, что я сделал, загрузил символы (вроде логично), но теперь вместо этого выдает "Исходный код не доступен" и предлагает посмотреть дизассемблированный код. Ах да, вот эта функция выше, она НЕ статическая. В поток я передаю ее по указателю на метод вместе с this.
И еще, при выходе из потока в отладчике я попал в файл xthread.
Там есть следующая ф-ия:
static unsigned int __stdcall _Call_func(void *_Data)
		{	// entry point for new thread
		static_cast<_Pad *>(_Data)->_Go();
		return (0);
		}

Вот именно в строчке return (0) мне и выдает ошибку..
В общем-то и все.
Буду благодарен за любую помощь!
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 2
maaGames
@maaGames
Погроммирую программы
_Data == nullptr, поэтому падает
Отладчик показывает СЛЕДУЮЩУЮ строчку, после которой произошла ошибка. Т.е. ошибка перед return. А там варианта всего два, либо _Data== nullptr, либо в фукнции _Go() что-то пошло не так и это дальше ковыряйся в отладчике :)
Ответ написан
Комментировать
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Программа просто написана неверно. recv может вернуть любое количество байт, от 0 до 31. Массив у вас при этом не инициализирован, и будет ли в нем 0 - не ясно.

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

Более того, прочитав только кусок данных, recv при следующем чтении прочтет продолжение этих данных, то есть, вместо начала следующей команды вы получите середину предыдущей, и как итог - полную фигню.

Вам нужно переписать чтение команд и переделать протокол так, чтобы длина очередной команды передавалась в начале этой самой команды.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы