C++ 如何使我的服务器多线程?
我有一个WinSock服务器,我想知道如何使它成为多线程的。我以前使用过线程,我了解它们的功能。但我不知道如何在服务器代码中使用它们。这就是: main.cppC++ 如何使我的服务器多线程?,c++,windows,multithreading,client-server,server-side,C++,Windows,Multithreading,Client Server,Server Side,我有一个WinSock服务器,我想知道如何使它成为多线程的。我以前使用过线程,我了解它们的功能。但我不知道如何在服务器代码中使用它们。这就是: main.cpp /* This is our Server */ //Includes #include "Functions.h" //Main function int main(){ DLLVERSION = MAKEWORD(2,1); answer = WSAStartup(DLLVERSION, &wsaData
/* 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()代码>但是一旦创建了另一个线程,最后一个线程就会因为某种原因而结束。有人能帮忙吗?您可以使用select
(或者poll
,如果您在POSIX平台上的话)来等待服务器套接字
选择:
您的主服务器进程监听套接字,一旦请求传入,您就派生一个线程(从线程池中)与客户机交互。这就是要点。Windows有一个线程池可供使用,请查看QueueUserWorkItem
Win 32调用您可能需要一些东西:
- 套接字是文本流,但您可能使用消息。您可能需要几个线程,每个线程侦听多个套接字。当它们确实有消息时,通常将该消息分派到另一个线程
- 在Windows中,您可以使用WSAWaitForMultipleObjects()
侦听多个套接字李>
WSAWaitForMultipleObjects
,第一个空闲侦听线程将拾取传入连接。这平衡了线程之间的负载没有必要编写一个服务器,用线程处理多个请求。您可以使用
select()
。这是一个要求吗?@Sebastian我正在编写一个游戏服务器,有必要使用游戏服务器吗?理论上没有必要,但实际上是的。顺便说一句,每个请求有一个线程可能也不是一个好主意。查看线程池。@MSalters对于游戏服务器,您建议我做什么?因为它将有多个玩家同时在线,我不需要像每毫秒一样接受连接吗?@user2635579:不需要。一个典型的游戏需要数千毫秒才能加载。只需提前发送连接请求,即使接受需要半秒钟,您的用户也不会注意到。问题建议Windows(重新标记)+在Windows上,如果他使用QueueUserWorkItem
Win 32 API,他可以拥有一个随时可用的线程池