void NEUROBITOBJ::load_devctx(void) { char szFileName[256]; char *extension; strcpy(szFileName,GLOBAL.configfile); if (extension = strstr(szFileName, ".con")) strcpy(extension,".nb"); else strcat(szFileName,".nb"); write_logfile("loading Neurobit device context from %s",szFileName); GLOBAL.neurobit_available=0; if (DevCtx>=0) NdCloseDevContext(DevCtx); DevCtx=ReadCfgFile(szFileName); if (DevCtx<0) { report_error ("Could not load Neurobit Config File - using default configuration"); DevCtx=NdOpenDevContext(device); } strcpy(device,NdGetDevName()); GLOBAL.neurobit_available=1; InvalidateRect(hDlg,NULL,FALSE); update_channelinfo(); SetDlgItemText(hDlg,IDC_NB_DEVICECOMBO,device); }
int CMainCtrl::Run() { while(1) { if(Flag_Exit == m_iRunFlag) { TLib_Log_LogMsg("Server Exit!\n"); return 0; } if(Flag_ReloadCfg == m_iRunFlag) { ReadCfgFile(m_stConfig.m_szCfgFileName); TLib_Log_LogMsg("reload config file ok!\n"); m_iRunFlag = 0; } // 1ms if(m_Svr2MePipe.GetCodeLength() == 0) m_stEPollFlow.Wait(1); else m_stEPollFlow.Wait(0); //每次循环取一次 gettimeofday(&m_tNow,NULL); //读取客户端包 CheckClientMessage(); //读取服务器端包 CheckSvrMessage(); //检测通讯超时 CheckTimeOut(); //写统计 WriteStat(); } return 0; }
void Worker::Initialize() { ReadCfgFile(); OpenComm(); }
int CMainCtrl::Initialize(char* pProName,char* pConfigFile) { //读配置 strcpy(m_stConfig.m_szSvrName,pProName); int iRet = ReadCfgFile(pConfigFile); if( 0 != iRet ) { return iRet; } //连接资源限制,root用户下有效 rlimit rlim; rlim.rlim_cur = m_stConfig.MAX_SOCKET_NUM+10240; rlim.rlim_max = m_stConfig.MAX_SOCKET_NUM+10240; setrlimit(RLIMIT_NOFILE, &rlim); //bind cpu if(m_stConfig.m_iBindCpu >= 0) { cpu_set_t mask; int iCpuId = m_stConfig.m_iBindCpu; printf("set cpu affinity %d.\n",iCpuId); CPU_ZERO(&mask); CPU_SET(iCpuId, &mask); sched_setaffinity(0, sizeof(mask), &mask); } //读so void* pHandle = dlopen(m_stConfig.m_szNetCompleteSo, RTLD_LAZY); if (!pHandle) { printf("open %s failed!\n",m_stConfig.m_szNetCompleteSo); printf("use ccs/src/make -f makefile.complete to make these so,and choose the one you want.\n"); return -1; } dlerror(); //Clear any existing error net_complete_func = (check_complete)dlsym(pHandle, "net_complete_func"); if (dlerror() != NULL) { printf("get net_complete_func from %s failed!\n",m_stConfig.m_szNetCompleteSo); return -1; } msg_header_len_func = (msg_header_len)dlsym(pHandle, "msg_header_len"); if (dlerror() != NULL) { printf("get msg_header_len from %s failed!\n",m_stConfig.m_szNetCompleteSo); return -1; } m_iMsgHeaderLen = msg_header_len_func(); //初始化epoll端口 if(m_stEPollFlow.Create(m_stConfig.MAX_SOCKET_NUM)) { printf("epoll create error!"); return -1; } //创建管道 if(CCodeQueue::CreateMQByFile(m_stConfig.m_szMeToSvrMQ,&m_Me2SvrPipe)) { printf("CreateCodeMQ %s failed!\n",m_stConfig.m_szMeToSvrMQ); return -1; } if(CCodeQueue::CreateMQByFile(m_stConfig.m_szSvrToMeMQ,&m_Svr2MePipe)) { printf("CreateCodeMQ %s failed!\n",m_stConfig.m_szSvrToMeMQ); return -1; } long long ullMemCost = 0; //创建CS消息缓冲区 int iMemSize = TIdxObjMng::CountMemSize(m_stConfig.RCV_BLOCK_SIZE,m_stConfig.RCV_BLOCK_NUM,1); char* pMem = new char[iMemSize]; m_stIdxObjMngRecv.AttachMem(pMem,iMemSize,m_stConfig.RCV_BLOCK_SIZE,m_stConfig.RCV_BLOCK_NUM,emInit,1); ullMemCost += (long long)iMemSize; iMemSize = CBuffMng::CountMemSize(m_stConfig.MAX_SOCKET_NUM); pMem = new char[iMemSize]; m_stBuffMngRecv.AttachMem(pMem,iMemSize,m_stConfig.MAX_SOCKET_NUM); ullMemCost += (long long)iMemSize; m_stBuffMngRecv.AttachIdxObjMng(&m_stIdxObjMngRecv); //创建SC消息缓冲区 iMemSize = TIdxObjMng::CountMemSize(m_stConfig.SND_BLOCK_SIZE,m_stConfig.SND_BLOCK_NUM,1); pMem = new char[iMemSize]; m_stIdxObjMngSend.AttachMem(pMem,iMemSize,m_stConfig.SND_BLOCK_SIZE,m_stConfig.SND_BLOCK_NUM,emInit,1); ullMemCost += (long long)iMemSize; iMemSize = CBuffMng::CountMemSize(m_stConfig.MAX_SOCKET_NUM); pMem = new char[iMemSize]; m_stBuffMngSend.AttachMem(pMem,iMemSize,m_stConfig.MAX_SOCKET_NUM); ullMemCost += (long long)iMemSize; m_stBuffMngSend.AttachIdxObjMng(&m_stIdxObjMngSend); //创建socket管理区 iMemSize = TIdxObjMng::CountMemSize(sizeof(TSocketNode),m_stConfig.MAX_SOCKET_NUM,1); pMem = new char[iMemSize]; m_stSocketNodeMng.AttachMem(pMem,iMemSize,sizeof(TSocketNode),m_stConfig.MAX_SOCKET_NUM,emInit,1); ullMemCost += (long long)iMemSize; iMemSize = CHashTab::CountMemSize(m_stConfig.MAX_SOCKET_NUM); pMem = new char[iMemSize]; m_stSocketNodeHash.AttachMem(pMem, iMemSize,m_stConfig.MAX_SOCKET_NUM); ullMemCost += (long long)iMemSize; m_stSocketNodeHash.AttachIdxObjMng(&m_stSocketNodeMng,SetSocketNodeKey,GetSocketNodeKey); //内存管道监听 if (m_Svr2MePipe.GetReadNotifyFD() >= 0) { iRet = CreateSocketNode(m_Svr2MePipe.GetReadNotifyFD(),TSocketNode::STATUS_OK, 0,0,"_PIPE_",TSocketNode::PIPE_SOCKET); if(iRet < 0) { printf("CreateSocketNode Failed!iRet=%d\n",iRet); return iRet; } } //管理端口 if(m_stConfig.m_iAdminPort > 0) { unsigned short usListenPort = (unsigned short)m_stConfig.m_iAdminPort; unsigned int unListenIP = inet_addr(m_stConfig.m_szAdminIp); int iListenSocket = CreateListenSocket(unListenIP,usListenPort, m_stConfig.SOCKET_RCVBUF,m_stConfig.SOCKET_SNDBUF); if (iListenSocket < 0) { printf("CreateListenSocket %u:%u failed!\n",unListenIP,usListenPort); TLib_Log_LogMsg("CreateListenSocket %u:%u failed!\n",unListenIP,usListenPort); return -2; } //加入监听数组 int iNewSuffix = CreateSocketNode(iListenSocket,TSocketNode::STATUS_OK, unListenIP,usListenPort,"_ADMIN_",TSocketNode::ADMIN_LISTEN_SOCKET); if (iNewSuffix < 0) { close(iListenSocket); printf("add to socket array failed!\n"); TLib_Log_LogMsg("add to socket array failed!\n"); return -3; } printf("Admin Listen on %s:%u Success!\n", m_stConfig.m_szAdminIp, m_stConfig.m_iAdminPort); } printf("%s Cost Mem %llu bytes.\n",SVR_NAME,ullMemCost); TLib_Log_LogMsg("Cost Mem %llu bytes.\n",ullMemCost); printf("Server Init Success!\n"); TLib_Log_LogMsg("Server Init Success!\n"); return 0; }