zoukankan      html  css  js  c++  java
  • 基于多线程的服务端,还没写完。。。

    // 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 初始化失败
    "));
    		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 
    ","create server success!!");
    		//printf("hostname: %s
    ",svrName);
    		//printf("hostinfo: %s", inet_ntoa(server_address.sin_addr));
    		//printf(":%d
    ",ntohs(server_address.sin_port));
    
    		//printf("%s","  
    ");
    		////printf("%d","  
    ",sockerr);
    
    		//printf("%s","wait for client msg!...
    ");
    	}
    
    
    
    	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<<"个线程 
    ";
    
    
    	}
    
    
    }
    
    
    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()<<"
    "<<endl;
    			
    			return 0;
    
    		}else
    		{
    			std::cout<<"接入新的客户端:"<<inet_ntoa(cltAddress.sin_addr)<<"
    "<<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 初始化失败
    "));
    		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 
    ","create server success!!");
    		//printf("hostname: %s
    ",svrName);
    		//printf("hostinfo: %s", inet_ntoa(server_address.sin_addr));
    		//printf(":%d
    ",ntohs(server_address.sin_port));
    
    		//printf("%s","  
    ");
    		////printf("%d","  
    ",sockerr);
    
    		//printf("%s","wait for client msg!...
    ");
    	}
    
    
    
    	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<<"个线已加入线程池,已开始自动初始化... 
    ";
    
    
    	}
    
    
    }
    
    
    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<<"个线已加入线程池,已开始自动初始化... 
    ";
    
    
    	}
    
    
    }
    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()<<"
    "<<endl;
    
    			return 0;
    
    		}else
    		{
    			std::cout<<"接入新的客户端:"<<inet_ntoa(cltAddress.sin_addr)<<"
    "<<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()<<"
    "<<endl;
    			
    			return 0;
    
    		}else
    		{
    			std::cout<<"接入新的客户端:"<<inet_ntoa(cltAddress.sin_addr)<<"
    "<<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;
    }
    

      

  • 相关阅读:
    近期简单题炸分总结
    传输层中的端口号
    TCP的三次握手与四次挥手
    ppq的面试题总结
    一个C++源文件从文本到可执行文件经历的过程
    C++中的&符号的运用:引用、取地址和右值引用
    C++中的拷贝构造、赋值构造函数
    C++中的虚函数
    函数指针与回调函数
    C++中的智能指针
  • 原文地址:https://www.cnblogs.com/cfas/p/3150577.html
Copyright © 2011-2022 走看看