C++ 如何使我的服务器多线程?

C++ 如何使我的服务器多线程?,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

我有一个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()但是一旦创建了另一个线程,最后一个线程就会因为某种原因而结束。有人能帮忙吗?

您可以使用
select
(或者
poll
,如果您在POSIX平台上的话)来等待服务器套接字

选择:


您的主服务器进程监听套接字,一旦请求传入,您就派生一个线程(从线程池中)与客户机交互。这就是要点。Windows有一个线程池可供使用,请查看
QueueUserWorkItem
Win 32调用您可能需要一些东西:

  • 套接字是文本流,但您可能使用消息。您可能需要几个线程,每个线程侦听多个套接字。当它们确实有消息时,通常将该消息分派到另一个线程
  • 在Windows中,您可以使用WSAWaitForMultipleObjects()
侦听多个套接字
  • 您确实需要一个线程来处理新的传入连接。一个就够了。每个新连接都应该发送到一个侦听器线程,并添加到其中一个侦听器线程
  • 侦听器线程在接收传入连接时可以发送欢迎消息
  • 您可以使用信号量跟踪未被侦听线程拾取的传入连接数。将信号量添加到
    WSAWaitForMultipleObjects
    ,第一个空闲侦听线程将拾取传入连接。这平衡了线程之间的负载

  • 没有必要编写一个服务器,用线程处理多个请求。您可以使用
    select()
    。这是一个要求吗?@Sebastian我正在编写一个游戏服务器,有必要使用游戏服务器吗?理论上没有必要,但实际上是的。顺便说一句,每个请求有一个线程可能也不是一个好主意。查看线程池。@MSalters对于游戏服务器,您建议我做什么?因为它将有多个玩家同时在线,我不需要像每毫秒一样接受连接吗?@user2635579:不需要。一个典型的游戏需要数千毫秒才能加载。只需提前发送连接请求,即使接受需要半秒钟,您的用户也不会注意到。问题建议Windows(重新标记)+在Windows上,如果他使用
    QueueUserWorkItem
    Win 32 API,他可以拥有一个随时可用的线程池