【问题标题】:How can I make my server multithreaded?如何使我的服务器多线程?
【发布时间】:2013-08-29 23:25:37
【问题描述】:

我有一个 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()。这是一个要求吗?
  • @Sebastian 我正在编写游戏服务器,是否有必要使用游戏服务器编写代码?
  • 理论上没有必要,但实际上可以。顺便说一句,每个请求都有一个线程可能也不是一个好主意。查看线程池。
  • @MSalters 你建议我为游戏服务器做什么?因为它会同时有多个玩家在线,我不需要像每毫秒一样接受连接吗?
  • @user2635579:不是真的。典型的游戏加载需要数千毫秒。只需提前发送连接请求,即使接受半秒钟,您的用户也不会注意到。

标签: c++ windows multithreading client-server server-side


【解决方案1】:

你可能想要一些东西:

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

【讨论】:

【解决方案2】:

您可以使用select(或poll,如果您在 POSIX 领域也可以使用)等待服务器套接字。

选择:Using select() for non-blocking sockets

您的主服务器进程在套接字上进行侦听,一旦有请求进入,您就会启动一个与客户端交互的线程(来自线程池)。这就是它的要点。 windows有线程池可以使用,看看QueueUserWorkItemWin 32调用http://msdn.microsoft.com/en-us/library/windows/desktop/ms684957%28v=vs.85%29.aspx

【讨论】:

  • 问题建议Windows(重新标记)
猜你喜欢
  • 2011-07-14
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 2014-04-24
相关资源
最近更新 更多