У меня есть сервер 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();
но как только создается другой поток, последний поток по какой-то причине заканчивается. Кто-нибудь может помочь?
Вы, вероятно, хотите несколько вещей:
WSAWaitForMultipleObjects()
слушать несколько сокетов. WSAWaitForMultipleObjects
и первый неактивный прослушивающий поток примет входящее соединение. Это уравновешивает нагрузку между потоками.Ты можешь использовать select
(или же poll
тоже, если вы находитесь на земле POSIX), чтобы ждать на сокете сервера.
Выбрать: Использование select () для неблокирующих сокетов
Ваш основной серверный процесс прослушивает сокет и, как только поступит запрос, вы раскручиваете поток (из пула потоков), который взаимодействует с клиентом. Это суть этого. Windows имеет пул потоков для использования, взгляните на QueueUserWorkItem
Win 32 Call http://msdn.microsoft.com/en-us/library/windows/desktop/ms684957%28v=vs.85%29.aspx