毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 课程设计 >> 正文

C++聊天室系统源代码 第4页

更新时间:2010-3-21:  来源:毕业论文
C++聊天室系统源代码 第4页
数据包类:
class CBuffer
{
public:
 CBuffer(void);
 ~CBuffer(void);
 void SetType(int type);
 void SetHead();  //设置包头,即包大小
 void AddInt(int data);
 void AddData(char* data,int len); //向buf中添加各种数据
 void AddString(string & str);
 void AddCString(CString& str);
 int GetType(); //获取包类型
 int GetPackageSize(); //获取包大小
 int GetInt();
 void GetData(char* buf,int len); //从buf中获取各种数据
 string GetString();
 CString GetCString();
 int Recv(SOCKET s);
 int Send(SOCKET s);
private:
 char* m_buf; //缓存区
 int m_write_index; //写入游标
 int m_readIndex; //读取游标
 int m_used;
};
 

网络通信线程工作函数:

DWORD CServer::WorkThread( LPVOID param )
{
 CServer* pServer = (CServer*)param;
 fd_set read_set;
 while (true)
 {
  FD_ZERO(&read_set);
  FD_SET(pServer->m_server_socket,&read_set);
  for (list<CUser*>::iterator p = pServer->m_users.begin();p != pServer->m_users.end(); ++p)
  {
   FD_SET((*p)->GetSocket(),&read_set);
  }
  if (select(0,&read_set,NULL,NULL,NULL) > 0)
  {
   if(FD_ISSET(pServer->m_server_socket,&read_set))
   {  //有连接加入
    sockaddr_in addrRemote;
    int nAddrLen = sizeof(addrRemote);
    SOCKET client_socket = accept(pServer->m_server_socket,(sockaddr*)&addrRemote,&nAddrLen);
    if (client_socket)
    { //为客户端分配CUser类
     CUser* pUser = new CUser(client_socket);
     pServer->m_users.push_back(pUser);
    }
   }

   for (list<CUser*>::iterator p = pServer->m_users.begin();p != pServer->m_users.end(); ++p)
   {
www.751com.cn
     int ret = (*p)->Recv();
     switch(ret)
     {
     case RECV_ERROR:
      {
       (*p)->Delete(); //发生异常,删除
       break;
      }
     case RECV_FINISH:
      {
       (*p)->AnalyseBuffer(); //完成,分析数据包
       break;
      }
     }
    }
   }
  }
 }

 return 0;
}

接收数据:

int CBuffer::Recv( SOCKET s )
{
 if (m_used < 4)
 { //接受数据包头,即数据包大小
  int len = recv(s,m_buf + m_used,4 - m_used,0);
  if (len == -1)
  {
   return RECV_ERROR;
  }
  m_used += len;
  if (m_used == 4)
  {
   int need  = GetPackageSize();
   if (need <= 0 || need > 512 - 4) //错误的数据包大小
   {
    return RECV_ERROR;
   }
  }
 }
 else
 {
  int need = GetPackageSize(); //接受数据类型和数据
  int len = recv(s,m_buf + m_used,need - m_used + 4,0);
  if (len == -1)
  {
   return RECV_ERROR;

上一页  [1] [2] [3] [4] [5] [6] 下一页

C++聊天室系统源代码 第4页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。