WEB开发网
开发学院软件开发VC 基于TCP/IP的局域网多用户通信 阅读

基于TCP/IP的局域网多用户通信

 2006-07-21 11:10:10 来源:WEB开发网   
核心提示: ●多线程每当服务器上有用户连接成功,服务器都会为其创建两个线程:接收线程(RecvData)和发送线程(SendData),基于TCP/IP的局域网多用户通信(5),并且接收线程在创建后处于可执行状态,而发送线程则阻塞,这儿,我定义了互斥量CMutex m_mutex,等待服务器将其唤醒,

●多线程

每当服务器上有用户连接成功,服务器都会为其创建两个线程:接收线程(RecvData)和发送线程(SendData),并且接收线程在创建后处于可执行状态,而发送线程则阻塞,等待服务器将其唤醒。这两个线程都执行一个无限循环的过程,只有当通信出现异常或用户端关闭连接时,线程才被自身所结束,并且,这两个线程一定是同时生成,同时结束的。很显然,每个连接产生两个线程,使得数据转发变的简单,但同时又使得服务器的任务加重。因此,用户端的连接数量有所限制,视服务器软、硬件能力而定。

同时,由于多线程对结构体info_data都需要操作,所以线程间必须同步。这儿,我定义了互斥量CMutex m_mutex,用它的方法Lock()和Unlock()来完成同步。

我们首先来看一下接收线程(RecvData):(不完整代码)

UINT RecvData(void* cs)
{ 
  SOCKET clientSocket=(SOCKET)cs;
  while(1)
  {
    numrcv=recv(clientSocket, buffer, MAXBUFLEN, NO_FLAGS_SET);
    buffer[numrcv]=''\0'';
    if(strcmp(buffer,"Close!")!=0) //不是接收的“Close”数据
    {
      …………
        for(i=0;i<count;i++)
        {
        if(po!=NULL)
        {
          s1=s_info.GetNext(po);
          if(s1.pet.Compare(petname)==0)   //比较昵称是否一样
          {
            m_mutex.Lock();  //互锁
            info_data.data=pos;
            info_data.thread=s1.thread;
            m_mutex.Unlock(); //解锁
          }
          s1.thread->ResumeThread(); //恢复发送相应的线程
          break;
        }
      }
    }
    else
    {
      …………
      if(clientSocket==s1.s_client)
      {
        m_mutex.Lock(); //互锁
        info_data.data=buffer;
        m_mutex.Unlock();      //解锁
        s1.thread->ResumeThread(); //恢复发送相应的线程
        s_info.RemoveAt(po1);    //删除该用户信息
        break;
      }
      ………
      goto aa;
    }
  }
  aa: closesocketlink((LPVOID)clientSocket);     //关闭连接
  AfxEndThread(0,true);              //结束本线程
  return 1;
}
接下来看一下发送线程(SendData):(不完整代码)

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

Tags:基于 TCP IP

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接