多个TCP下select的使用

这是网上下的代码,体现了select的使用

DWORD WINAPI Connect_Thread(LPVOID lpParam)
{
 CTest_NonBlockSocket_ClientDlg *pDlg=(CTest_NonBlockSocket_ClientDlg *)lpParam;
 SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
 SOCKADDR_IN server;
 server.sin_family=AF_INET;
 server.sin_addr.s_addr=inet_addr(serverip);
 server.sin_port=htons(listenport);
 if(connect(sock,(SOCKADDR *)&server,sizeof(server))==SOCKET_ERROR)
 {
  closesocket(sock);
  CString temp;
  temp.Format("connect error:%d",WSAGetLastError());
//  CStdioFile m_file("C://123.txt",CFile::modeCreate|CFile::modeWrite);
//  m_file.WriteString(temp);
//  pDlg->m_list.AddString(temp);
  MessageBox(pDlg->m_hWnd,"ERR",temp,MB_OK);
  return 0;
 }
 fd_set fdRecv;
 fd_set fdSend;
 timeval seltime;
 int iRecv=0;
 int iSend=0;
 CArray<int,int> arraySendBuffer;
 CRITICAL_SECTION cs_array;
 InitializeCriticalSection(&cs_array);
 bool isConnect=TRUE;
 while(isConnect)
 {
  FD_ZERO(&fdRecv);
  FD_ZERO(&fdSend);
  FD_SET(sock,&fdRecv);
  FD_SET(sock,&fdSend);
  int ret=select(0,&fdRecv,&fdSend,NULL,&seltime);
  if(ret==SOCKET_ERROR)
  {
   isConnect=FALSE;
   break;
  }
  else if(ret==0)
   continue;
  if(FD_ISSET(sock,&fdRecv))
  {
   char buffer[512];
   ret=recv(sock,buffer,sizeof(buffer),0);
   if(ret==0)
   {
    isConnect=FALSE;
    break;
   }
   int nleft=0;
   while(ret>0)     //处理粘包
   {
    memcpy(&iRecv,buffer+nleft,4);
    nleft+=4;
    ret-=4;
    CString temp;
    temp.Format("recv %d;Len:%d",iRecv,ret);
    pDlg->m_list.AddString(temp);
    EnterCriticalSection(&cs_array);
    TRACE("ADD");
    arraySendBuffer.Add(iRecv);
    LeaveCriticalSection(&cs_array);
   }
    
  }
  if(FD_ISSET(sock,&fdSend)&&arraySendBuffer.GetSize()>0)
  {
   int i=0;
   while(i<arraySendBuffer.GetSize())
   {
    EnterCriticalSection(&cs_array);
    TRACE("GET");
    iSend=arraySendBuffer.GetAt(i);
    LeaveCriticalSection(&cs_array);
    char buffer[4];
    memcpy(buffer,&iSend,sizeof(iSend));
    if(send(sock,buffer,sizeof(iSend),0)==SOCKET_ERROR)
    {isConnect=FALSE;break;}
    arraySendBuffer.RemoveAt(i);
    i=i+1;
   }
   
  } 

 }
 closesocket(sock);
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值