基于多线程的服务端,还没写完。。。
// 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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南