所谓并发模型,就是当服务器端accept一个新的连接请求后,便开一个新线程,处理与客户端的连接。并发模型简单易用,适用于客户端的并发连接请求不多的应用中,但并发请求过多便不适用。
示例代码如下:
(完整示例代码可参看:)
//循环接受客户端连接请求,请求到达到,开新线程与客户端交互
while (1)
{
SOCKADDR_IN saddr;
int len=sizeof(saddr);
SOCKET tmpsock = accept(pSocketServer->m_hSocket,(PSOCKADDR)&saddr,&len);
if (tmpsock < 0)
{
DEBUG_PRINT("accept error!/n");
continue;
}
SocketInfo *pSocketInfo = new SocketInfo;
pSocketInfo->addr = saddr;
pSocketInfo->Socket = tmpsock;
//Create a Thread to accept client connection
UINT Handle = _beginthreadex(NULL, 0, WorkThread, (LPVOID)pSocketInfo, 0, 0);
if (Handle == NULL)
{
DEBUG_PRINT("Create thread error!/n");
}
}
//工作线程
UINT __stdcall CSocketServer::WorkThread(LPVOID Param)
{
SocketInfo * pSocketInfo = (SocketInfo *)Param;
int retval;
char sMsg[MAX_PACKET_LEN + 1];
char sErrorBuf[100];
char sIP[20];
strcpy(sIP,inet_ntoa(pSocketInfo->addr.sin_addr));
while (1)
{
//recv the data from client
retval = recv(pSocketInfo->Socket,sMsg,MAX_PACKET_LEN,0 );
if (retval == SOCKET_ERROR) {
sprintf(sErrorBuf,"recv() failed: error %d/n",WSAGetLastError());
DEBUG_PRINT(sErrorBuf);
closesocket(pSocketInfo->Socket);
break;
}
if (retval == 0) {
DEBUG_PRINT("Client closed connection/n");
closesocket(pSocketInfo->Socket);
break;
}
sMsg[retval] = '/0';
//对收到的数据进行处理
ProcessPacket(sMsg,pSocketInfo);
//Parse the msg token times
//DEBUG_PRINT(sMsg);
}
if(pSocketInfo->pFileBuffer)
{
delete []pSocketInfo->pFileBuffer;
}
delete pSocketInfo;
return 0;
}