Socket编程之并发模型

  所谓并发模型,就是当服务器端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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值