Я прихожу из Java, поэтому мне это очень сложно понять. Я пишу программу клиент/сервер, чтобы начать изучение C++.Динамически создавать объекты в цикле
ServerSocket server(30000);
while (true) {
ServerSocket new_sock;
server.accept(new_sock);
std::cout << "client connected...\n";
ClientConnectionThread *cct = new ClientConnectionThread(new_sock);
cct->start();
}
Проблема возникает, когда я пытаюсь записать в сокет в ClientConnectionThread.
client_sock << someObj;
Exception was caught in cct: Could not write to socket.
Мое предположение заключается в том, что после cc-> start(); команда ServerSocket потеряет «область» и будет удалена со стека и автоматически закрыта. Чтобы исправить это, я изменил код:
ServerSocket server(30000);
while (true) {
ServerSocket *new_sock; <----
server.accept(new_sock);
std::cout << "client connected...\n";
ClientConnectionThread *cct = new ClientConnectionThread(new_sock);
cct->start();
}
Но программа даже не входит в цикл .. с сообщения об ошибках не говорил мне, почему это не работает (конечно изменения необходимый код, чтобы принять указатель).
Если это не очевидно, что я пытаюсь сделать. Я ищу для создания нового потока на каждом клиентском соединении для обработки каждого клиента. Конечно, потоку будет нужна ссылка на сокет для приема и отправки - вот почему я передаю его объекту CCT.
Если вам нужно больше кода, дайте мне знать.
Я не вижу, где вы на самом деле * создаете * * new_sock. Кроме того, позаботьтесь о балансе 'new' с' delete'. – Bathsheba
Да - создайте сокет с новым. Вы можете удалить его, когда вы в конце концов закроете его в ClientConnectionThread. –
Каждый 'новый' нуждается в' delete', иначе он будет одинок. –