免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1887 | 回复: 0
打印 上一主题 下一主题

多个客户端连接 为什么只有最后一个连接的才可以与服务器通信 求助在线等谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-28 13:25 |只看该作者 |倒序浏览
本帖最后由 bsknight 于 2011-06-28 13:28 编辑

多个客户端连接 只有最后一个连接的才可以与服务器通信

服务器代码:


  1. 服务器类成员变量:CArray<CRRUItem, CRRUItem> m_RRUArray;   用于存储各个RRU连接
  2. // RRU元素
  3. class CRRUItem {
  4. public:
  5.         unsigned char m_Id[11];                                                //        RRU标识
  6.         SOCKET m_socket;
  7.         CWinThread *pWinThread;                                       
  8.         //HANDLE hThread;
  9.         CBBUDlg *m_pDlgBBU;// 指向BBU窗口的指针
  10.        
  11.         CRRUItem()
  12.         {
  13.                 memset(m_Id, 0, sizeof(m_Id));
  14.                 m_pDlgBBU = NULL;
  15.                 m_socket = INVALID_SOCKET;
  16.                 pWinThread = NULL;
  17.         }
  18. };
  19. int CBBUDlg::InitServer( LPVOID lpParam, unsigned short wPort, int nClientNum )
  20. {
  21.     CBBUDlg *BBUDlg = (CBBUDlg *)lpParam;
  22.     ASSERT(BBUDlg != NULL);

  23.     BBUDlg->m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  24.     if(NULL == BBUDlg->m_socket)
  25.     {
  26.         BBUDlg->PrintToEdit("socket初始化失败.\r\n", BBUDlg, IDC_EDIT_CONTENT);
  27.         return 0;
  28.     }
  29.     SOCKADDR_IN addrSrv;
  30.     addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
  31.     addrSrv.sin_family=AF_INET;
  32.     addrSrv.sin_port=htons(wPort);

  33.     if(bind(BBUDlg->m_socket,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)) == SOCKET_ERROR )
  34.     {
  35.         BBUDlg->PrintToEdit("绑定端口失败.\r\n", BBUDlg, IDC_EDIT_CONTENT);
  36.         return 0;
  37.     }

  38.     if(listen(BBUDlg->m_socket,nClientNum) == SOCKET_ERROR )
  39.     {
  40.         BBUDlg->PrintToEdit("监听失败.\r\n", BBUDlg, IDC_EDIT_CONTENT);
  41.         return 0;
  42.     }

  43.     int len=sizeof(SOCKADDR);
  44.     while(1)
  45.     {
  46.         if ( Select(READ, nTimeOut, BBUDlg->m_socket) )
  47.         {
  48.             sockaddr_in clientAddr;
  49.             int iLen = sizeof(sockaddr_in);
  50.             SOCKET accSock = accept(BBUDlg->m_socket, (struct sockaddr *)&clientAddr , &iLen);
  51.             if (accSock == INVALID_SOCKET)
  52.             {
  53.                 continue;
  54.             }
  55.             // 将每个RRU的信息以CRRUItem的形式保存至m_RRUArray
  56.             //    为每个连接的RRU开设一个线程
  57.             CRRUItem tItem;
  58.             tItem.m_socket = accSock;
  59.             tItem.m_pDlgBBU = BBUDlg;

  60.             INT_PTR idx = BBUDlg->m_RRUArray.Add(tItem);


  61.             tItem.pWinThread = AfxBeginThread(BBUDlg->RRUThreadProc, &tItem );
  62.             
  63.             BBUDlg->m_RRUArray.GetAt(idx).pWinThread = tItem.pWinThread;

  64.             ResumeThread(tItem.pWinThread);

  65.             char cBuff[] = "BBU:Hello!\r\n";
  66.             Send(cBuff, sizeof(cBuff), accSock);

  67.             Sleep(100);
  68.         }
  69.     }
  70.     closesocket(BBUDlg->m_socket);
  71.     return 1;
  72. }
  73. UINT CBBUDlg::RRUThreadProc( LPVOID pParam )
  74. {
  75.     CRRUItem *RRU = (CRRUItem *)pParam;
  76.     BR_PACKAGE pkg;
  77.     ASSERT(RRU != NULL);

  78.     CRRUItem tItem;
  79.     for(int index = 0; index<RRU->m_pDlgBBU->m_RRUArray.GetSize(); index++)
  80.     {
  81.         tItem = RRU->m_pDlgBBU->m_RRUArray.GetAt(index);
  82.     }
  83.     while (1)
  84.     {
  85.         ASSERT(RRU->m_socket != INVALID_SOCKET);

  86.         if(Select(READ, nTimeOut, RRU->m_socket))
  87.         {
  88.             //    先接收头部
  89.             if(0 == Recv((char *)&pkg.head, sizeof(pkg.head), RRU->m_socket) )
  90.             {
  91.                 EnterCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
  92.                 RRU->m_pDlgBBU->PrintToEdit("接收数据失败!\r\n", RRU->m_pDlgBBU, IDC_EDIT_CONTENT);
  93.                 LeaveCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
  94.             }
  95.             //    再根据头部接收数据部
  96.             switch(ntohl(pkg.head.Command_Id))
  97.             {
  98.             case nBR_BROADCAST:
  99.                 {
  100.                     EnterCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
  101.                     RRU->m_pDlgBBU->PrintHEAD(_T("RRU->BBU"), _T("BR_BROADCAST"), RRU->m_pDlgBBU, pkg);
  102.                     LeaveCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);

  103.                     memcpy(RRU->m_Id, (char *)pkg.head.Id, sizeof(RRU->m_Id));
  104.                     RRU->m_Id[10] = '\0';

  105.                     //    再接收数据部分
  106.                     BR_BROADCAST *broadCast = (BR_BROADCAST *)pkg.data;
  107.                     if( false == Recv( (char *)broadCast, sizeof(BR_BROADCAST),  RRU->m_socket) )
  108.                         return 0;   

  109.                     EnterCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
  110.                     RRU->m_pDlgBBU->PrintBR_BROADCAST(RRU->m_pDlgBBU, (BR_BROADCAST *)pkg.data);
  111.                     LeaveCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);

  112.                 }
  113.                 break;
  114.             }
  115.             EnterCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
  116.             RRU->m_pDlgBBU->KeepScrollDown(RRU->m_pDlgBBU, IDC_EDIT_CONTENT);
  117.             LeaveCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
  118.         }
  119.     }
  120.     return 0;
  121. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP