基于多线程的服务端,还没写完。。。
// PosServer.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "PosServer.h" #include "Commdef.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 唯一的应用程序对象 CWinApp theApp; using namespace std; int _tmain( int argc, TCHAR* argv[], TCHAR* envp[] ) { int nRetCode = 0; // 初始化 MFC 并在失败时显示错误 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: 更改错误代码以符合您的需要 _tprintf(_T("错误: MFC 初始化失败\n")); nRetCode = 1; } else { CreateMeThreadpool(500); ServerRun(); } while(1); return nRetCode; } void ServerRun() { /* 主机名 */ char svrName[128]; /* 主机IP */ int svrIp; char poststr[2500]; static WSADATA wsaData; /* hostent 主机的信息*/ struct hostent * pHostent; memset(&server_address,0, sizeof(struct sockaddr) ); UINT initWskStatus = 0; if( ( initWskStatus = WSAStartup(MAKEWORD(2,2), &wsaData) ) != 0 ) {// 初始化失败 std::cout<<"SOCKET初始化失败"<<endl; return; } if ( (sockSrv = socket(AF_INET, SOCK_STREAM, 0) ) <0 ){ std::cout<<"SOCKET创建失败"<<endl; return; } gethostname(svrName, 127); pHostent = gethostbyname(svrName); memcpy(&svrIp, pHostent->h_addr_list[0], sizeof(pHostent->h_addr_list[0])); /*指定协议族*/ server_address.sin_family = AF_INET; /*指定端口将主机序转为网络序*/ server_address.sin_port = htons(SERVPORT); /*获取本机IP sin_addr是个结构体*/ //server_address.sin_addr.s_addr = svrIp; server_address.sin_addr.s_addr = htonl(INADDR_ANY); UINT sockerr = bind( sockSrv, (struct sockaddr *) &server_address, sizeof(server_address) ); if ( sockerr < 0 ) { std::cout<<"端口绑定失败"<<endl; return; }else { std::cout<<"服务创建成功"<<endl; //system("cls"); //printf("%s \n","create server success!!"); //printf("hostname: %s\n",svrName); //printf("hostinfo: %s", inet_ntoa(server_address.sin_addr)); //printf(":%d\n",ntohs(server_address.sin_port)); //printf("%s"," \n"); ////printf("%d"," \n",sockerr); //printf("%s","wait for client msg!...\n"); } listen(sockSrv, MAXCONNTIONNUM); HANDLE hThread = CreateThread(NULL, 0, GetClient, 0, 0, NULL); } void CreateMeThreadpool(UINT count) { for (int i=0; i<count; i++) { ThreadObj threadObj; HANDLE hThread = CreateThread(NULL, 0, ConnectClientWork, 0, 0, NULL); if ( hThread != NULL ) { //休眠线程 需要判断值 SuspendThread(hThread); threadObj.threadHandle = hThread; threadObj.status = 0; threadPool.push_back(threadObj); } std::cout<<"第"<<i<<"个线程 \n"; } } DWORD WINAPI GetClient(PVOID lpParamter) { int sinSize = sizeof(struct sockaddr_in); while(1) { //标示符 SOCKET cltSvr; /* 创建客户端地址信息 */ struct sockaddr_in cltAddress; if ( ( cltSvr = accept( sockSrv,(struct sockaddr*)&cltAddress,&sinSize )) < 0 ) { std::cout<<"ACCEPT失败,错误玛:"<<WSAGetLastError()<<"\n"<<endl; return 0; }else { std::cout<<"接入新的客户端:"<<inet_ntoa(cltAddress.sin_addr)<<"\n"<<endl; threadParm.sockHandle = cltSvr; threadParm.addres = cltAddress; //开始寻找空闲线程池 threadIter = find_if( threadPool.begin(), threadPool.end(), findx); if ( threadIter != threadPool.end() ) { threadIter->status = 1; std:cout << ResumeThread( threadIter->threadHandle ) << endl; //break; } } } return 0; } bool findx(ThreadObj &tObj) { return tObj.status == 0; } DWORD WINAPI ConnectClientWork(LPVOID lpParam) { SOCKET cltHandle = threadParm.sockHandle; sockaddr_in cltAddress = threadParm.addres; char recvBuf[100]; while(1) { recv(cltHandle,recvBuf,sizeof(recvBuf),0); std::cout<<recvBuf<<endl; send(cltHandle,recvBuf,sizeof(recvBuf),0); } return 0; }
0.0.2版本
// PosServer.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "PosServer.h" #include "Commdef.h" #include "CommandCenter.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 唯一的应用程序对象 CWinApp theApp; using namespace std; int _tmain( int argc, TCHAR* argv[], TCHAR* envp[] ) { int nRetCode = 0; // 初始化 MFC 并在失败时显示错误 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: 更改错误代码以符合您的需要 _tprintf(_T("错误: MFC 初始化失败\n")); nRetCode = 1; } else { //开辟内存线程池 CreateMeThreadpool(500); ServerRun(); } while(1); return nRetCode; } void ServerRun() { /* 主机名 */ char svrName[128]; /* 主机IP */ int svrIp; char poststr[2500]; static WSADATA wsaData; /* hostent 主机的信息*/ struct hostent * pHostent; memset(&server_address,0, sizeof(struct sockaddr) ); UINT initWskStatus = 0; if( ( initWskStatus = WSAStartup(MAKEWORD(2,2), &wsaData) ) != 0 ) {// 初始化失败 std::cout<<"SOCKET初始化失败"<<endl; return; } if ( (sockSrv = socket(AF_INET, SOCK_STREAM, 0) ) <0 ){ std::cout<<"SOCKET创建失败"<<endl; return; } gethostname(svrName, 127); pHostent = gethostbyname(svrName); memcpy(&svrIp, pHostent->h_addr_list[0], sizeof(pHostent->h_addr_list[0])); /*指定协议族*/ server_address.sin_family = AF_INET; /*指定端口将主机序转为网络序*/ server_address.sin_port = htons(SERVPORT); /*获取本机IP sin_addr是个结构体*/ //server_address.sin_addr.s_addr = svrIp; server_address.sin_addr.s_addr = htonl(INADDR_ANY); UINT sockerr = bind( sockSrv, (struct sockaddr *) &server_address, sizeof(server_address) ); if ( sockerr < 0 ) { std::cout<<"端口绑定失败"<<endl; return; }else { std::cout<<"服务创建成功"<<endl; //system("cls"); //printf("%s \n","create server success!!"); //printf("hostname: %s\n",svrName); //printf("hostinfo: %s", inet_ntoa(server_address.sin_addr)); //printf(":%d\n",ntohs(server_address.sin_port)); //printf("%s"," \n"); ////printf("%d"," \n",sockerr); //printf("%s","wait for client msg!...\n"); } listen(sockSrv, MAXCONNTIONNUM); HANDLE hThread = CreateThread(NULL, 0, GetClient, 0, 0, NULL); } void CreateMeThreadpool(UINT count) { for (int i=0; i<count; i++) { ThreadObj threadObj; //HANDLE hThread = CreateThread(NULL, 0, ConnectClientWork, 0,0, NULL); //创建挂起的线程 HANDLE hThread = CreateThread(NULL, 0, ConnectClientWork, 0,CREATE_SUSPENDED, NULL); if ( hThread != NULL ) { SellpThreadPool.push_back( hThread ); } std::cout<<"第"<<i<<"个线已加入线程池,已开始自动初始化... \n"; } } void CreateMeThreadpool_bak(UINT count) { for (int i=0; i<count; i++) { ThreadObj threadObj; //HANDLE hThread = CreateThread(NULL, 0, ConnectClientWork, 0,0, NULL); //创建挂起的线程 HANDLE hThread = CreateThread(NULL, 0, ConnectClientWork, 0,CREATE_SUSPENDED, NULL); if ( hThread != NULL ) { //休眠线程 需要判断值,将线程挂起 //SuspendThread(hThread); threadObj.id = i; threadObj.threadHandle = hThread; threadObj.status = 0; threadPool.push_back( threadObj ); } std::cout<<"第"<<i<<"个线已加入线程池,已开始自动初始化... \n"; } } DWORD WINAPI GetClient(PVOID lpParamter) { int sinSize = sizeof(struct sockaddr_in); while(1) { //标示符 SOCKET cltSvr; /* 创建客户端地址信息 */ struct sockaddr_in cltAddress; if ( ( cltSvr = accept( sockSrv,(struct sockaddr*)&cltAddress,&sinSize )) < 0 ) { std::cout<<"ACCEPT失败,错误玛:"<<WSAGetLastError()<<"\n"<<endl; return 0; }else { std::cout<<"接入新的客户端:"<<inet_ntoa(cltAddress.sin_addr)<<"\n"<<endl; //构造好参数 threadParm.sockHandle = cltSvr; threadParm.addres = cltAddress; HANDLE hT = SellpThreadPool.back(); ActiveThreadPool.push_back(hT); SellpThreadPool.pop_back(); std:cout << ResumeThread( hT ) << endl; } } return 0; } DWORD WINAPI GetClient_bak(PVOID lpParamter) { int sinSize = sizeof(struct sockaddr_in); while(1) { //标示符 SOCKET cltSvr; /* 创建客户端地址信息 */ struct sockaddr_in cltAddress; if ( ( cltSvr = accept( sockSrv,(struct sockaddr*)&cltAddress,&sinSize )) < 0 ) { std::cout<<"ACCEPT失败,错误玛:"<<WSAGetLastError()<<"\n"<<endl; return 0; }else { std::cout<<"接入新的客户端:"<<inet_ntoa(cltAddress.sin_addr)<<"\n"<<endl; //构造好参数 threadParm.sockHandle = cltSvr; threadParm.addres = cltAddress; //寻找休眠线程 threadIter = find_if( threadPool.begin(), threadPool.end(), findx); if ( threadIter != threadPool.end() ) { threadParm.id = threadIter->id; threadIter->status = 1; std:cout << ResumeThread( threadIter->threadHandle ) << endl; //break; } } } return 0; } bool findx(ThreadObj &tObj) { return tObj.status == 0; } DWORD WINAPI ConnectClientWork(LPVOID lpParam) { SOCKET cltHandle = threadParm.sockHandle; sockaddr_in cltAddress = threadParm.addres; char recvBuf[255]; int status = 0; while(1) { status = recv( cltHandle,recvBuf,sizeof( recvBuf )+1,0 ); if ( status == 0 || status == SOCKET_ERROR ) {//处理正常退出和异常退出 //没有客户端队列,目前先取消线程的队列 acIt = find( ActiveThreadPool.begin(), ActiveThreadPool.end(), GetCurrentThread() ); if( acIt != ActiveThreadPool.end() ) // finded { shutdown(cltHandle,2); closesocket(cltHandle); std::cout<<WSAGetLastError()<<endl; //挂起该线程 SuspendThread( GetCurrentThread() ); //在活动队列中去掉线程 ActiveThreadPool.erase(acIt); //在挂起队列中加入 SellpThreadPool.push_back((*acIt)); } }else { if ( status > 0 ) { std::cout<<recvBuf<<endl; CRITICAL_SECTION cs; // EnterCriticalSection(&cs);//加锁 CommmitCmd(cltHandle,recvBuf); // LeaveCriticalSection(&cs); } } //ZeroMemory(recvBuf,0); //send(cltHandle,recvBuf,sizeof(recvBuf),0); } //挂起当前线程SuspendThread(GetCurrentThread) return 0; } DWORD WINAPI ConnectClientWork_bak(LPVOID lpParam) { SOCKET cltHandle = threadParm.sockHandle; sockaddr_in cltAddress = threadParm.addres; char recvBuf[255]; int status = 0; while(1) { status = recv( cltHandle,recvBuf,sizeof( recvBuf )+1,0 ); if ( status == 0 || status == SOCKET_ERROR ) {//处理正常退出和异常退出 for ( threadIter=threadPool.begin(); threadIter!=threadPool.end(); threadIter++ ) { if ( ((*threadIter).id) == threadParm.id ) { //设置状态 (*threadIter).status = 0; std::cout<<"退出线程id:"<<(*threadIter).id<<":句柄:"<<(*threadIter).threadHandle<<endl; break; } } shutdown(cltHandle,2); closesocket(cltHandle); std::cout<<WSAGetLastError()<<endl; //挂起该线程 SuspendThread( GetCurrentThread() ); }else { if ( status > 0 ) { std::cout<<recvBuf<<endl; CRITICAL_SECTION cs; // EnterCriticalSection(&cs);//加锁 CommmitCmd(cltHandle,recvBuf); // LeaveCriticalSection(&cs); } } //ZeroMemory(recvBuf,0); //send(cltHandle,recvBuf,sizeof(recvBuf),0); } //挂起当前线程SuspendThread(GetCurrentThread) return 0; }
Rust编程语言群 1036955113
java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
大数据 elasticsearch 群 481975850
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
大数据 elasticsearch 群 481975850
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。