初解禁:SDK服务端主程序入口函数SDK服务端主程序入口函数
生活随笔
收集整理的這篇文章主要介紹了
初解禁:SDK服务端主程序入口函数SDK服务端主程序入口函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/********************************************************************
函 數 名: main
功能描述: SDK服務端主程序入口函數SDK服務端主程序入口函數
返 回 值: 成功返回RESULT_SUCCESS,失敗返回RESULT_FAIL
********************************************************************/
INT main()
{WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_NOTICE, g_enDebugFlag, "1. Enter SDK Server Main Function and set rlimit!");if(SIG_ERR == signal(SIGTERM, ExitProcess)){WRITE_LOG(LOG_TYPE_CRITICAL, LOG_LEVEL_NOTICE, g_enDebugFlag, "signal func error!");exit(0);}struct epoll_event evEpoll;struct epoll_event evEpollEvents[EPOLL_MAX_EVENT];struct rlimit rtSdk;memset(&evEpoll, 0x00, sizeof(struct epoll_event));memset(evEpollEvents, 0x00, sizeof(struct epoll_event) * EPOLL_MAX_EVENT);memset(&rtSdk, 0x00, sizeof(struct rlimit));/* 1.設置進程允許打開的最大文件數為EPOLL_MAX_EVENT */rtSdk.rlim_max = rtSdk.rlim_cur = 100;if(setrlimit(RLIMIT_NOFILE, &rtSdk) == RESULT_FAIL){WRITE_LOG(LOG_TYPE_CRITICAL, LOG_LEVEL_NONE, DEBUG_FLAG_OPEN, "SdkServer set rlimit fail, now exit process!");exit(0);}WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_NOTICE, g_enDebugFlag, "2. InitSdkServer!");LONG lResult = RESULT_SUCCESS;/* 2.初始化 */lResult = InitSdkServer();if(RESULT_FAIL == lResult){WRITE_LOG(LOG_TYPE_CRITICAL, LOG_LEVEL_NONE, DEBUG_FLAG_OPEN, "InitSdkServer fail, now exit process!");exit(0);}WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_NOTICE, g_enDebugFlag, "3. Create epoll fd!");/*3.創建epoll句柄,把監聽的socket加入到 epoll */g_iEpollFd = epoll_create(EPOLL_MAX_EVENT);if(InvalidFd == g_iEpollFd){lResult = ReleaseSdkServer();WRITE_LOG(LOG_TYPE_CRITICAL, LOG_LEVEL_NONE, DEBUG_FLAG_OPEN, "Create epoll fail, now exit process!");exit(0);}WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_NOTICE, g_enDebugFlag, "4. BuildTcpSocket and SetNonBlock!");/* 4.建立TCP連接 */lResult = BuildTcpSocket(&g_stTcpSock);if(RESULT_FAIL == lResult){lResult = ReleaseSdkServer();WRITE_LOG(LOG_TYPE_CRITICAL, LOG_LEVEL_NONE, DEBUG_FLAG_OPEN, "BuildTcpSocket fail, now exit process!");exit(0);}WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_NOTICE, g_enDebugFlag, "5. Epoll ctl add tcp listen read event and set Edge Triggered mode!");evEpoll.events = EPOLLIN; /* 監聽讀事件并設置LT模式 */evEpoll.data.fd = g_stTcpSock.lTcpFd; /* 將全局的TCP listenFd 添加的epoll的事件 */if(epoll_ctl(g_iEpollFd, EPOLL_CTL_ADD, g_stTcpSock.lTcpFd, &evEpoll) < 0){lResult = ReleaseSdkServer();WRITE_LOG(LOG_TYPE_CRITICAL, LOG_LEVEL_NONE, DEBUG_FLAG_OPEN, "EPOLL_CTL_ADD tcp fd fail, now exit process!");exit(0);}WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_NOTICE, g_enDebugFlag, "6. BuildUnixSocket and SetNonBlock!");/* 5.建立域套接字連接*/g_lUnixFd = BuildUnixSocket(PATH_SDK);if(RESULT_FAIL == g_lUnixFd){lResult = ReleaseSdkServer();WRITE_LOG(LOG_TYPE_CRITICAL, LOG_LEVEL_NONE, DEBUG_FLAG_OPEN, "BuildUnixSocket fail, now exit process!");exit(0);}if(RESULT_FAIL == SetSockBlock(g_lUnixFd, FALSE)){lResult = ReleaseSdkServer();close(g_lUnixFd);WRITE_LOG(LOG_TYPE_CRITICAL, LOG_LEVEL_NONE, DEBUG_FLAG_OPEN, "Set g_lUnixFd NonBlock fail, now exit process!");exit(0);}WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_NOTICE, g_enDebugFlag, "7. Epoll ctl add unix domain read event and set Edge Triggered mode!");evEpoll.events = EPOLLIN; /* 監聽讀事件并設置LT模式 */evEpoll.data.fd = g_lUnixFd; /* 將全局的TCP listenFd 添加的epoll的事件 */if(epoll_ctl(g_iEpollFd, EPOLL_CTL_ADD, g_lUnixFd, &evEpoll) < 0){lResult = ReleaseSdkServer();WRITE_LOG(LOG_TYPE_CRITICAL, LOG_LEVEL_NONE, DEBUG_FLAG_OPEN, "EPOLL_CTL_ADD unixdomain fd fail, now exit process!");exit(0);}/* 設置當前監聽的FD數目為2:TCPlistenFd UnixDomainFd */INT iCurFdNum = 2;INT iActiveFdNum = 0; /* epoll_wait返回的需要處理的事件數目 */INT iTimeOut = 2 * CONN_SECOND_IN_MS; /* epoll_wait的超時時間,默認2秒 */INT iCurFd = -1;INT iNewClientFd = -1;WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_NOTICE, g_enDebugFlag, "8. Enter main loop!");/* 進入主循環 */while(1){/* 等待有事件發生,非阻塞模式 */iActiveFdNum = epoll_wait(g_iEpollFd, evEpollEvents, iCurFdNum, iTimeOut);if(0 > iActiveFdNum){WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_ERR, g_enDebugFlag, "epoll_wait[%d] error!", g_iEpollFd);continue;}for(iCurFd = 0; iCurFd < iActiveFdNum; ++iCurFd){if(evEpollEvents[iCurFd].data.fd == g_stTcpSock.lTcpFd) /* 新客戶連接事件 */{iNewClientFd = HandleTcpAccept(evEpollEvents[iCurFd].data.fd);if(RESULT_FAIL == iNewClientFd){WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_WARNING, g_enDebugFlag,"HandleTcpAccept fail, TcpFd = %d, new client fd = %d!", evEpollEvents[iCurFd].data.fd, iNewClientFd);continue;}evEpoll.events = EPOLLIN; /* 監聽讀事件并設置為LT模式 */evEpoll.data.fd = iNewClientFd; /* 將新連接的ClientFd 添加的epoll的事件 */if(epoll_ctl(g_iEpollFd, EPOLL_CTL_ADD, iNewClientFd, &evEpoll) < 0){if(RESULT_SUCCESS != DeleteClientNode(g_pstClientInfo, iNewClientFd)){WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_ERR, g_enDebugFlag,"DeleteClientNode error, ClientFd = %d!", iNewClientFd);}CloseTcp(iNewClientFd, g_iEpollFd);WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_WARNING, g_enDebugFlag,"EPOLL_CTL_ADD fail, Deleted Client Node, ClientFd = %d!", iNewClientFd);continue;}/* 當前監聽的FD數目++ */iCurFdNum++;/* 操作日志,新客戶上線 */}else if(evEpollEvents[iCurFd].data.fd == g_lUnixFd) /* 域套接字可讀事件 */{lResult = HandleUnixRead(evEpollEvents[iCurFd].data.fd);if(RESULT_SUCCESS != lResult){WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_ERR, g_enDebugFlag,"HandleUnixRead fail, fd = %d!", evEpollEvents[iCurFd].data.fd);continue;}}else /* 客戶連接可讀事件 */{lResult = HandleTcpRead(evEpollEvents[iCurFd].data.fd);if(RESULT_FAIL == lResult){WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_WARNING, g_enDebugFlag,"HandleTcpRead fail, fd = %d!", evEpollEvents[iCurFd].data.fd);lResult = GetSockState(evEpollEvents[iCurFd].data.fd);if(TCP_ESTABLISHED != lResult){WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_WARNING, g_enDebugFlag,"GetSockState error, ClientFd = %d, Result = %d!", evEpollEvents[iCurFd].data.fd, lResult);CLIENT_INFO_NODE_S * pstCurrentClientNode = NULL;pstCurrentClientNode = GetClientInfoByClientFd(g_pstClientInfo, evEpollEvents[iCurFd].data.fd);if(NULL == pstCurrentClientNode){WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_ERR, g_enDebugFlag,"GetClientInfoByClientFd error, ClientFd = %d!", evEpollEvents[iCurFd].data.fd);}else{if(TRUE == pstCurrentClientNode->bUpgrade){MSG_DATA_S stMsgData = {0};stMsgData.enCmdType = CMD_UPGRADE_STOP;stMsgData.enMsgType = MSG_SET;strncpy(stMsgData.szClientUserName, SDK, CLIENT_NAME_LEN_MAX);stMsgData.ulClientPort = (ULONG)pstCurrentClientNode->stClientAddr.sin_port;strncpy(stMsgData.szClientIp, inet_ntoa(pstCurrentClientNode->stClientAddr.sin_addr),IP_ADDR_LEN_MAX);strncpy(stMsgData.szDst, PATH_CONTROL, ADDR_LEN);strncpy(stMsgData.szSrc, PATH_SDK, ADDR_LEN);lResult = SendMsgToUnixSocket(&stMsgData,PATH_CONTROL);if(RESULT_SUCCESS != lResult){WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_ERR, g_enDebugFlag,"SendMsgToControl fail.");}else{WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_INFO, g_enDebugFlag,"Send Msg To control stop uprade success!");}//刪除寫入的升級文件lResult = DeleteUpgradeFile();if(RESULT_SUCCESS != lResult){WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_ERR, g_enDebugFlag,"DeleteUpgradeFile fail.");}}}if(RESULT_SUCCESS != DeleteClientNode(g_pstClientInfo, evEpollEvents[iCurFd].data.fd)){WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_ERR, g_enDebugFlag,"DeleteClientNode error, ClientFd = %d!", evEpollEvents[iCurFd].data.fd);}CloseTcp(evEpollEvents[iCurFd].data.fd, g_iEpollFd);/*如果沒有客戶端在連接,取消告警訂閱*/if(0 == g_pstClientInfo->lClientNum){MSG_DATA_S stMsgData ;memset(&stMsgData, 0x00, sizeof(MSG_DATA_S));stMsgData.enMsgType = MSG_NOTIFY;stMsgData.enCmdType = CMD_ALARM_SUBSCRIPTION;stMsgData.enResultType = RESULT_SUCCESS;strncpy(stMsgData.szDst, PATH_CONTROL, ADDR_LEN);strncpy(stMsgData.szSrc, PATH_SDK, ADDR_LEN);strncpy(stMsgData.szClientIp, "127.0.0.1", IP_ADDR_LEN_MAX);strncpy(stMsgData.szClientUserName, SDK, CLIENT_NAME_LEN_MAX);stMsgData.unCmdBody.stAlarmSubscription.enAlarmType = ALARM_TYPE_ALL;stMsgData.unCmdBody.stAlarmSubscription.enSubcription = ENABLE_FALSE;if(RESULT_FAIL == SendMsgToUnixSocket(&stMsgData, PATH_CONTROL)){WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_ERR, g_enDebugFlag, "Send cancel alarm subscription to control fail!");}else{WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_INFO, g_enDebugFlag, "Send cancel alarm subscription to control success!");}}WRITE_LOG(LOG_TYPE_DEBUG, LOG_LEVEL_ERR, g_enDebugFlag,"Client abnormal exit, Close client Socket and free client node, fd = %d!", evEpollEvents[iCurFd].data.fd);/* 操作日志,客戶異常掉線 */}}}}}WRITE_LOG(LOG_TYPE_CRITICAL, LOG_LEVEL_NONE, DEBUG_FLAG_OPEN, "0. Main loop terminate, now exit process!");CLOSE_LOG();lResult = ReleaseSdkServer();exit(0);
}
轉載于:https://www.cnblogs.com/xuejianhui/articles/2749445.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的初解禁:SDK服务端主程序入口函数SDK服务端主程序入口函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 局域网Ubuntu与WinXP实现文件共
- 下一篇: 019、Linux性能监控:memory