У меня есть домашнее задание по FTP с использованием CSocket в C ++. Я использую Mfc на основе диалога в качестве интерфейса для моего приложения. Использование многопоточности для работы с несколькими клиентами (1 сервер - много клиентов). Я использую кнопку «Слушать». Каждый раз, когда я нажимаю кнопку, сервер начинает слушать. Но проблема здесь, я поместил Accecpt в цикл для обработки muti-клиентов (каждый клиент будет идти в отдельном потоке), но теперь я не могу закрыть диалоговое окно сервера, когда захочу. Он застрял в кнопке «Listen» навсегда Можете ли вы дать мне несколько советов, чтобы все заработало?
Спасибо.
Пожалуйста, не говорите мне о Select или Poll, я использую Windows, а не Linux.
Я хочу оставить CSocket, а не Winsock. Я пытался закрыть прослушивание в другой теме, но это не сработало.
void CServerDlg::OnBnClickedListen()
{
// TODO: Add your control notification handler code here
if (listen.Create(PORT, SOCK_STREAM, _T("127.0.0.1")) == 0) {
showMessage("Failed to init socket");
listen.GetLastError();
return;
}
else {
if (listen.Listen(1) == FALSE) {
showMessage("Can't listen to the port");
listen.Close();
return;
}
}
int cnt = -1;
CSocket* client;
while (1)
{
client = new CSocket();
if (listen.Accept(*client))
{
cnt++;
char * id = Converter::StringToChar(Converter::NumberToString(*client));
clients.push_back(client);
ClientId.push_back(id);
showMessage("Found a connection with client " + Converter::CharToString(id));
/*
Thread here
*/
threads.push_back(thread(&CServerDlg::ThreadProc, this, cnt));
}
else break;
}
listen.Close();
for (int i = 0; i < clients.size(); i++)
{
if (clients[i] != NULL)
{
clients[i]->Close();
}
}
clients.clear();
}
```
void CServerDlg::OnBnClickedCancel()
{
// TODO: Add your control notification handler code here
// i want every time i click 'cancel; button theaplcaton will clsoe
}
```