⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpserver.cpp

📁 五子棋的其中一个代码 是里面用户登陆的
💻 CPP
字号:
//	Implementation of class CTCPServer
//	Author: ShiXingdong
//	Last modify: Jun 1st, 2002

#include <string>
#include "TCPServer.h"

using namespace std;

const int g_nBufSize=10240;	// buffer size = 10 KB

bool g_bStopWorking;	//停止工作的标志
bool g_bTurnOn;			//服务器已打开的标志
bool  (*g_pReceptionist)(SOCKET sct);	//相应客户端请求的函数的指针
DWORD WINAPI g_AcceptClient(LPVOID lpParam);	//接收客户端连接的函数
DWORD WINAPI g_ProcessClientRequest(LPVOID lpParam);	//响应客户端请求的函数


bool CTCPServer::Initialize(unsigned short nPortNum)
{
	g_bStopWorking=false;
	g_bTurnOn=false;
	g_pReceptionist=NULL;

	m_nPortNum=nPortNum;
	m_ServerAddress.sin_family=AF_INET;
	m_ServerAddress.sin_port=htons(nPortNum);
	m_ServerAddress.sin_addr.s_addr=htonl(INADDR_ANY);

	//建立套接字
	if((m_sctListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==INVALID_SOCKET)
		return(false);
	//帮定套接字
	if(bind(m_sctListenSocket,(sockaddr*)&m_ServerAddress,sizeof(m_ServerAddress))==SOCKET_ERROR)
		return(false);
	//侦听
	listen(m_sctListenSocket,SOMAXCONN);
	return(true);
}

CTCPServer::CTCPServer(unsigned short nPortNum)
{
	m_bInitSuccess=false;
	WSADATA data;
	if(WSAStartup(MAKEWORD(2,2),&data)!=0)
		return;
	if(!Initialize(nPortNum))
		return;
	DWORD dwThreadID;
	
	//建立接收客户端连接的线程
	if(CreateThread(NULL,0,g_AcceptClient,(LPVOID)m_sctListenSocket,0,&dwThreadID)==NULL)
		return;
	m_bInitSuccess=true;
	return;
}

CTCPServer::~CTCPServer()
{
	g_bStopWorking=true;
	WSACleanup();
}


bool CTCPServer::SetReceptionist(bool (*pFunc)(SOCKET sct))
{
	g_pReceptionist=pFunc;
	return(true);
}


bool CTCPServer::IsOK() const
{
	return(m_bInitSuccess&&(g_pReceptionist!=NULL));
}

string CTCPServer::GetIPAddr() const
{
	char szHostName[128];
	struct hostent * pHost;
	int i; 

	if(gethostname(szHostName,128)==0)
	{
		pHost = gethostbyname(szHostName);
		for(i=0; (pHost!= NULL) && (pHost->h_addr_list[i]!= NULL); i++ )
		{
			return(string(inet_ntoa (*(struct in_addr *)pHost->h_addr_list[i])));
		}
	}
	return(string(""));
}

bool CTCPServer::TurnOn()
{
	g_bTurnOn=true;
	return(true);
}

bool CTCPServer::TurnOff()
{
	g_bTurnOn=false;
	return(true);
}

DWORD WINAPI g_AcceptClient(LPVOID lpParam)
{
	SOCKET sctListenSocket=(SOCKET)lpParam;
	SOCKET *pConnectSocket;
	sockaddr_in ClientAddress;
	int iAddressSize=sizeof(ClientAddress);
	int bReuse=true;
	DWORD dwThreadID;
	while(!g_bStopWorking)
	{	
		if(!g_bTurnOn)
			continue;
		pConnectSocket=new SOCKET;
		*pConnectSocket=accept(sctListenSocket,(sockaddr*)&ClientAddress,&iAddressSize);
		setsockopt(*pConnectSocket,SOL_SOCKET,SO_REUSEADDR,(char *)&bReuse,sizeof(bReuse));
		if(*pConnectSocket!=INVALID_SOCKET)
			CreateThread(NULL,0,g_ProcessClientRequest,(LPVOID)*pConnectSocket,0,&dwThreadID);
	}
	return(0);
}

DWORD WINAPI g_ProcessClientRequest(LPVOID lpParam)
{
	SOCKET sctClientSocket=(SOCKET)lpParam;

	while(!g_bStopWorking)
	{
		if(!g_bTurnOn)	//服务器未打开
			continue;
		if(g_pReceptionist==NULL)	//未设置接待函数
			continue;
		if(!g_pReceptionist(sctClientSocket))	//不再响应客户端请求
			break;
	}
	return(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -