Как я могу сделать свой сервер многопоточным?

У меня есть сервер WinSock, и мне было интересно, как сделать его многопоточным. Я использовал темы раньше, и я понимаю, что они делают. Но я не уверен, как использовать их с моим кодом сервера. Итак, вот оно:

main.cpp

/* This is our Server */

//Includes
#include "Functions.h"
//Main function
int main(){
DLLVERSION = MAKEWORD(2,1);
answer = WSAStartup(DLLVERSION, &wsaData);
sConnect = socket(AF_INET, SOCK_STREAM, NULL);
addr.sin_addr.s_addr = inet_addr(HostIP);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
sListen = socket(AF_INET, SOCK_STREAM, NULL);
bind(sListen, (SOCKADDR*)&addr, sizeof(addr));
listen(sListen, SOMAXCONN);

//Listening for clients
for(;;){
Print("Waiting for incoming connections");
//If a connection is found
if(sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen)){
Print("Connection found!");
Send("Hello!");
}
}
}

Как бы я сделал этот сервер многопоточным?

Я пытался с помощью CreateThread(); но как только создается другой поток, последний поток по какой-то причине заканчивается. Кто-нибудь может помочь?

1

Решение

Вы, вероятно, хотите несколько вещей:

  • Сокеты — это текстовые потоки, но вы, вероятно, используете сообщения. Вы, вероятно, хотите несколько потоков, каждый из которых слушает несколько сокетов. Когда у них есть сообщение, отправьте это сообщение, как правило, в другой поток.
  • В Windows вы бы использовали WSAWaitForMultipleObjects() слушать несколько сокетов.
  • Вы действительно хотите, чтобы поток имел дело с новыми входящими соединениями. Одного должно быть достаточно. Каждое новое соединение должно быть отправлено на добавление в один из этих потоков слушателя.
  • Приветственные сообщения могут быть отправлены потоком слушателя, когда он принимает входящее соединение.
  • Вы можете использовать семафор, чтобы отслеживать количество входящих соединений, еще не перехваченных прослушивающими потоками. Добавьте семафор в WSAWaitForMultipleObjectsи первый неактивный прослушивающий поток примет входящее соединение. Это уравновешивает нагрузку между потоками.
0

Другие решения

Ты можешь использовать select (или же poll тоже, если вы находитесь на земле POSIX), чтобы ждать на сокете сервера.

Выбрать: Использование select () для неблокирующих сокетов

Ваш основной серверный процесс прослушивает сокет и, как только поступит запрос, вы раскручиваете поток (из пула потоков), который взаимодействует с клиентом. Это суть этого. Windows имеет пул потоков для использования, взгляните на QueueUserWorkItem Win 32 Call http://msdn.microsoft.com/en-us/library/windows/desktop/ms684957%28v=vs.85%29.aspx

0

По вопросам рекламы [email protected]