基于多线程的服务端,还没写完。。。

// 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;
}

  

posted @ 2013-06-23 04:09  方东信  阅读(286)  评论(0编辑  收藏  举报