如何使我的服务器多线程
How can I make my server multithreaded?
我有一台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有一个线程池可以使用,看看QueueUserWorkItem
Win32调用http://msdn.microsoft.com/en-us/library/windows/desktop/ms684957%28v=vs.85%29.aspx
相关文章:
- C/C++ Linux 上的多线程服务器/客户端崩溃
- 设计低线程争用的多线程聊天服务器
- 使用线程池提升 ASIO 多线程 TCP 服务器
- C++多线程服务器
- 简单的非阻塞多线程 tcp 服务器
- 卫生多线程服务器
- 在多线程c++服务器应用程序中处理非常量全局配置
- 多线程服务器在一个线程中处理多个客户端
- 在 GDB 中调试多线程服务器 - 查找每个线程的状态.执行时继续并停止
- 多线程服务器在不等待客户端连接的情况下退出
- 多线程服务器不工作
- 多线程服务器
- 调试多线程服务器
- 套接字在多线程服务器中不能正确接受
- C++具有 Winsock 和 std::thread 的多线程服务器
- c++中的多线程服务器,如何很好地终止线程和清理
- 多线程服务器设计
- 创建多线程服务器的问题
- 带有std::线程强制转换变量的c++多线程服务器
- 多线程服务器与boost.Asio