我有一个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();
但是只要创建了另一个线程,最后一个线程就会因某种原因而结束。有人可以帮忙吗?
答案 0 :(得分:0)
您可以使用select
(如果您在POSIX上,也可以使用poll
)等待服务器套接字。
选择:Using select() for non-blocking sockets
您的主服务器进程在套接字上进行侦听,一旦请求进入,您就会分离一个与客户端交互的线程(来自线程池)。这是它的要点。 Windows有一个线程池可供使用,请查看QueueUserWorkItem
Win 32来电http://msdn.microsoft.com/en-us/library/windows/desktop/ms684957%28v=vs.85%29.aspx
答案 1 :(得分:0)
你可能想要一些东西:
WSAWaitForMultipleObjects()
来收听多个套接字。 WSAWaitForMultipleObjects
,第一个空闲侦听线程将获取传入连接。这可以平衡线程之间的负载。