如何使我的服务器多线程

How can I make my server multithreaded?

本文关键字:多线程 服务器 我的 何使      更新时间:2023-10-16

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

您可能想要一些东西:

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

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

select:对非阻塞套接字使用select()

主服务器进程侦听套接字,一旦收到请求,就从线程池中派生出一个与客户端交互的线程。这就是它的要点。Windows有一个线程池可以使用,看看QueueUserWorkItemWin32调用http://msdn.microsoft.com/en-us/library/windows/desktop/ms684957%28v=vs.85%29.aspx