CSocket用在多线程中

该博客介绍了如何在C++多线程环境下使用CSocket类进行网络连接和通信。通过创建线程,设置代理,连接服务器,并处理连接错误,展示了聊天服务器连接的实现细节,包括登录过程和错误处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unsigned __stdcall CXXXChatRoomProcessor::ThreadFunc(void* lParam)
{
  if (!AfxSocketInit())
  {
    AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
    return FALSE;
  }
  ThreadParam *p = (ThreadParam*)lParam;
  CXXXChatRoomProcessor *processor = (CXXXChatRoomProcessor *)p->obj;
  processor->isRunThread = TRUE;
  if(processor->m_socket->m_hSocket!=NULL)
  {
    processor->m_bIsConnected = true;
    processor->OnCloseSocket();
  }
  processor->m_socket->SetProxy( processor->nProxyType, processor->ProxyHost, processor->ProxyPort,
    processor->ProxyUser, processor->ProxyPass, processor->bUseSocks5Logon );

  if(!processor->m_socket->create())
  {
    processor->OnConnect(-1);
    return false;
  }
  TRACE("正在连接聊天服务器/n");
  processor->m_socket->SetTimeOut(50000);
  if(!processor->m_socket->Connect(p->addr,p->port))
  {  
    processor->OnConnect(1);
    return false;
  }
  processor->m_socket->KillTimeOut();
  TRACE("连接聊天服务器完毕/n");
  processor->m_bIsConnected = true;
  processor->Active = true;
  processor->OnConnect(0);
   while(processor->isRunThread)
  {
    MSG msg;
    Sleep(5);
    if(::PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
    {
      ::TranslateMessage(&msg);
      ::DispatchMessage(&msg);
    }
  }
  
processor->OnCloseSocket();
  return true;
}

void CXXXChatRoomProcessor::Connect(char *svrAddr, unsigned short port)
{
  isRunThread = FALSE;
  pThreadParam.obj = this;
  pThreadParam.addr = svrAddr;
  pThreadParam.port = port;
  HANDLE  m_hThread = createThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, &pThreadParam, 0, NULL);
}

void CXXXChatRoomProcessor::OnConnect(int nErrorCode)
{
  switch(nErrorCode)
  {
  case -1:
    OnChatMessage("/n初始化socket错误! 请重试...",RGB(0,100,0));
    break;
  case 1:
    {
      KillTimer(EVENT_LOGIN_TEST);
      KillTimer(EVENT_TRY_CONNECT);//停止
      int c =WSAGetLastError();
      m_socket->Close();
      if(!bAutoConnect) //如果是自动尝试重新连接,不弹出对话框
      {
        CString err;
        err.Format("/n连接聊天服务器失败,请重试! 错误代码:%d", c);//请检查网络连接是否正常!无法连接服务器,
        SetTrayIcon(XXXX_DISCONNECT);
        OnChatMessage(err,RGB(0,100,0));
      }
      bAutoConnect = false;
      m_bIsConnected = false;
      Active = false;
      SetTrayIcon(XXXX_DISCONNECT);
    }
    break;
  case 0: //如果连接成功
    {
      if(xxxx_conn==XXXX_GATESERVER)
      {
        if(m_bIsConnected)
        {
          std::string username = user;
          std::string password = pass;
          unsigned short clientversion =0x222;

          LoginChatRoomPacket* packet = XXXPacketFactory::newLoginChatRoomPacket();
          packet->setUserName(username);
          std::string md5Ret;
          getStringMD5Value(password.c_str(),md5Ret);
          packet->setPassword(md5Ret);//password
          packet->setClientVersion(clientversion);
          char* buf = new char[packet->getPacketLength()];
          XXXPacketFactory::toCharBuffer(packet,buf);

          m_socket->Send(buf, packet->getPacketLength());

          XXXPacketFactory::freePacket(packet);
          delete[] buf;

          //同时启动登录返回测试消息时间中断验证过程,如果10秒钟内没有消息返回,认为服务器那头有问题。同时提示登录超时
          TRACE("正在登录服务器/n");
          OnChatMessage("正在登录服务器...",RGB(0,100,0));
          SetTimer(EVENT_LOGIN_TEST,30000,NULL);
        }
      }
      else if (xxxx_conn==XXXX_SERVER)
      {
        //登录消息服务器
        LoginInServer();
      }
    }
    break;
  }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值