| |
| #include "TcpServer.h" |
| #include "CLogFile.h" |
| #include <string> |
| #include <pthread.h> |
| #include <vector> |
| |
| CLogFile logfile; |
| TcpServer tcpServer; |
| std::vector<long> vpthids; |
| |
| void mainEXIT(int sig) |
| { |
| if(sig>0) |
| { |
| signal(sig,SIG_IGN); |
| signal(SIGINT,SIG_IGN); |
| signal(SIGTERM,SIG_IGN); |
| |
| printf("mthserver exit..(PID=%d)\n",getpid()); |
| logfile.Write("mthserver exit..(PID=%d)\n",getpid()); |
| |
| tcpServer.CloseListen(); |
| for(auto& pthid:vpthids) |
| { |
| pthread_cancel(pthid); |
| } |
| std::vector<long>(0).swap(vpthids); |
| exit(0); |
| } |
| } |
| |
| void pthExit(void* arg) |
| { |
| int sockfd=(int)(long)arg; |
| close(sockfd); |
| |
| for(auto iter=vpthids.begin();iter!=vpthids.end();) |
| { |
| if(*iter==pthread_self()) |
| vpthids.erase(iter); |
| else |
| iter++; |
| } |
| |
| logfile.Write("thread clean..\n") ; |
| } |
| |
| bool biz002(const char* strRecvBuffer,char* strSendBuffer) |
| { |
| char msg[1024]; |
| memset(msg,0,sizeof(msg)); |
| GetXmlBuffer(strRecvBuffer,"message",msg,1023); |
| |
| strcat(msg," ok"); |
| sprintf(strSendBuffer,"<retcode>0</retcode><message>%s</message>",msg); |
| return true; |
| } |
| |
| |
| |
| bool biz001(const char* strRecvBuffer,char* strSendBuffer) |
| { |
| |
| char username[51],password[51]; |
| memset(username,0,sizeof(username)); |
| memset(password,0,sizeof(password)); |
| |
| GetXmlBuffer(strRecvBuffer,"username",username,50); |
| GetXmlBuffer(strRecvBuffer,"password",password,50); |
| |
| |
| if((strcmp(username, "wk")==0)&&(strcmp(password, "p@ssw0rd")==0)) |
| sprintf(strSendBuffer,"<retcode>0</retcode><message>login success</message>"); |
| else |
| sprintf(strSendBuffer,"<retcode>-1</retcode><message>用户名或密码不正确</message>"); |
| |
| return true; |
| } |
| |
| |
| bool biz000(const char* strRecvBuffer,char* strSendBuffer) |
| { |
| sprintf(strSendBuffer, "<retcode>0</retcode><message>heartbeat success</message>"); |
| return true; |
| } |
| |
| |
| |
| |
| bool BusinessProcess(const char* strRecvBuffer,char* strSendBuffer) |
| { |
| int ibizcode=-1; |
| GetXmlBuffer(strRecvBuffer,"bizcode",&ibizcode); |
| |
| switch(ibizcode) |
| { |
| case 0: |
| return biz000(strRecvBuffer,strSendBuffer); |
| break; |
| case 1: |
| return biz001(strRecvBuffer,strSendBuffer); |
| break; |
| case 2: |
| return biz002(strRecvBuffer,strSendBuffer); |
| break; |
| default: |
| logfile.Write("非法报文:%s\n",strSendBuffer); |
| return false; |
| } |
| } |
| |
| void* thmainfunc(void* arg) |
| { |
| pthread_detach(pthread_self()); |
| pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); |
| pthread_cleanup_push(pthExit,arg); |
| |
| char strRecvBuffer[1024]; |
| char strSendBuffer[1024]; |
| int sockfd=(int)(long)arg; |
| while(true) |
| { |
| memset(strRecvBuffer,0,sizeof(strRecvBuffer)); |
| memset(strSendBuffer,0,sizeof(strSendBuffer)); |
| int iBufferlen; |
| if(tcpServer.TcpRead(sockfd,strRecvBuffer, &iBufferlen,300)==false) |
| break; |
| logfile.Write("recv msg:%s\n",strRecvBuffer); |
| |
| |
| if(BusinessProcess(strRecvBuffer,strSendBuffer)==false) |
| pthread_exit(0); |
| |
| logfile.Write("send msg:%s\n",strSendBuffer); |
| if(tcpServer.TcpWrite(sockfd,strSendBuffer)==false) |
| break; |
| } |
| |
| logfile.Write("client(%s) disconnected..\n", tcpServer.GetIP()); |
| pthread_cleanup_pop(1); |
| pthread_exit(0); |
| } |
| |
| |
| int main(int argc, char** argv) |
| { |
| if(argc!=3) |
| { |
| printf("Using: ./mthserver port logfile\nExample:./mthserver 5000 /tmp/mthserver.log\n\n"); |
| return -1; |
| } |
| |
| for(int i=0;i<70;i++) |
| { |
| signal(i, SIG_IGN); |
| } |
| |
| logfile.m_bBackup=false; |
| |
| if(logfile.Open(argv[2], "a+") == false) |
| { |
| printf("logfile open failed..(%s)\n", argv[2]); |
| } |
| |
| signal(SIGINT,mainEXIT); |
| signal(SIGTERM,mainEXIT); |
| if(tcpServer.InitServer(atoi(argv[1]))==false) |
| { |
| logfile.Write("server init failed..\n"); |
| mainEXIT(-1); |
| } |
| |
| while(true) |
| { |
| if(tcpServer.Accept()==false) |
| { |
| logfile.Write("client(%s) connected failed..\n", tcpServer.GetIP()); |
| continue; |
| } |
| logfile.Write("client(%s) connected..\n", tcpServer.GetIP()); |
| |
| pthread_t pthid; |
| if(pthread_create(&pthid,NULL,thmainfunc,(void*)(long)tcpServer.m_clientfd)!=0) |
| { |
| logfile.Write("create thread failed..\n"); |
| return -1; |
| } |
| vpthids.push_back(pthid); |
| } |
| return 0; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)