- 论坛徽章:
- 0
|
本帖最后由 bsknight 于 2011-06-28 13:28 编辑
多个客户端连接 只有最后一个连接的才可以与服务器通信
服务器代码:
- 服务器类成员变量:CArray<CRRUItem, CRRUItem> m_RRUArray; 用于存储各个RRU连接
- // RRU元素
- class CRRUItem {
- public:
- unsigned char m_Id[11]; // RRU标识
- SOCKET m_socket;
- CWinThread *pWinThread;
- //HANDLE hThread;
- CBBUDlg *m_pDlgBBU;// 指向BBU窗口的指针
-
- CRRUItem()
- {
- memset(m_Id, 0, sizeof(m_Id));
- m_pDlgBBU = NULL;
- m_socket = INVALID_SOCKET;
- pWinThread = NULL;
- }
- };
- int CBBUDlg::InitServer( LPVOID lpParam, unsigned short wPort, int nClientNum )
- {
- CBBUDlg *BBUDlg = (CBBUDlg *)lpParam;
- ASSERT(BBUDlg != NULL);
- BBUDlg->m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
- if(NULL == BBUDlg->m_socket)
- {
- BBUDlg->PrintToEdit("socket初始化失败.\r\n", BBUDlg, IDC_EDIT_CONTENT);
- return 0;
- }
- SOCKADDR_IN addrSrv;
- addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
- addrSrv.sin_family=AF_INET;
- addrSrv.sin_port=htons(wPort);
- if(bind(BBUDlg->m_socket,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)) == SOCKET_ERROR )
- {
- BBUDlg->PrintToEdit("绑定端口失败.\r\n", BBUDlg, IDC_EDIT_CONTENT);
- return 0;
- }
- if(listen(BBUDlg->m_socket,nClientNum) == SOCKET_ERROR )
- {
- BBUDlg->PrintToEdit("监听失败.\r\n", BBUDlg, IDC_EDIT_CONTENT);
- return 0;
- }
- int len=sizeof(SOCKADDR);
- while(1)
- {
- if ( Select(READ, nTimeOut, BBUDlg->m_socket) )
- {
- sockaddr_in clientAddr;
- int iLen = sizeof(sockaddr_in);
- SOCKET accSock = accept(BBUDlg->m_socket, (struct sockaddr *)&clientAddr , &iLen);
- if (accSock == INVALID_SOCKET)
- {
- continue;
- }
- // 将每个RRU的信息以CRRUItem的形式保存至m_RRUArray
- // 为每个连接的RRU开设一个线程
- CRRUItem tItem;
- tItem.m_socket = accSock;
- tItem.m_pDlgBBU = BBUDlg;
- INT_PTR idx = BBUDlg->m_RRUArray.Add(tItem);
- tItem.pWinThread = AfxBeginThread(BBUDlg->RRUThreadProc, &tItem );
-
- BBUDlg->m_RRUArray.GetAt(idx).pWinThread = tItem.pWinThread;
- ResumeThread(tItem.pWinThread);
- char cBuff[] = "BBU:Hello!\r\n";
- Send(cBuff, sizeof(cBuff), accSock);
- Sleep(100);
- }
- }
- closesocket(BBUDlg->m_socket);
- return 1;
- }
- UINT CBBUDlg::RRUThreadProc( LPVOID pParam )
- {
- CRRUItem *RRU = (CRRUItem *)pParam;
- BR_PACKAGE pkg;
- ASSERT(RRU != NULL);
- CRRUItem tItem;
- for(int index = 0; index<RRU->m_pDlgBBU->m_RRUArray.GetSize(); index++)
- {
- tItem = RRU->m_pDlgBBU->m_RRUArray.GetAt(index);
- }
- while (1)
- {
- ASSERT(RRU->m_socket != INVALID_SOCKET);
- if(Select(READ, nTimeOut, RRU->m_socket))
- {
- // 先接收头部
- if(0 == Recv((char *)&pkg.head, sizeof(pkg.head), RRU->m_socket) )
- {
- EnterCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
- RRU->m_pDlgBBU->PrintToEdit("接收数据失败!\r\n", RRU->m_pDlgBBU, IDC_EDIT_CONTENT);
- LeaveCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
- }
- // 再根据头部接收数据部
- switch(ntohl(pkg.head.Command_Id))
- {
- case nBR_BROADCAST:
- {
- EnterCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
- RRU->m_pDlgBBU->PrintHEAD(_T("RRU->BBU"), _T("BR_BROADCAST"), RRU->m_pDlgBBU, pkg);
- LeaveCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
- memcpy(RRU->m_Id, (char *)pkg.head.Id, sizeof(RRU->m_Id));
- RRU->m_Id[10] = '\0';
- // 再接收数据部分
- BR_BROADCAST *broadCast = (BR_BROADCAST *)pkg.data;
- if( false == Recv( (char *)broadCast, sizeof(BR_BROADCAST), RRU->m_socket) )
- return 0;
- EnterCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
- RRU->m_pDlgBBU->PrintBR_BROADCAST(RRU->m_pDlgBBU, (BR_BROADCAST *)pkg.data);
- LeaveCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
- }
- break;
- }
- EnterCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
- RRU->m_pDlgBBU->KeepScrollDown(RRU->m_pDlgBBU, IDC_EDIT_CONTENT);
- LeaveCriticalSection(&RRU->m_pDlgBBU->m_csec_editContent);
- }
- }
- return 0;
- }
复制代码 |
|