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

📄 listenserver.cpp

📁 A3服务端AccountServer源代码
💻 CPP
字号:
#include "StdInc.h"


CListenServer::CListenServer()
{
	m_bConnect = FALSE;
}

CListenServer::~CListenServer()
{

}


void	CListenServer::ReportWSAErr()
{
	char bufLog[30];

	switch(WSAGetLastError())
	{
		case WSANOTINITIALISED:	strcpy(bufLog, "WSANOTINITIALISED");	break;
		case WSAENETDOWN:		strcpy(bufLog, "WSAENETDOWN");			break;
		case WSAEADDRINUSE:		strcpy(bufLog, "WSAEADDRINUSE");		break;
		case WSAEADDRNOTAVAIL:	strcpy(bufLog, "WSAEADDRNOTAVAIL");		break;
		case WSAEFAULT:			strcpy(bufLog, "WSAEFAULT");			break;
		case WSAEINPROGRESS:	strcpy(bufLog, "WSAEINPROGRESS");		break;
		case WSAEINVAL:			strcpy(bufLog, "WSAEINVAL");			break;
		case WSAEISCONN:		strcpy(bufLog, "WSAEISCONN");			break;
		case WSAEMFILE:			strcpy(bufLog, "WSAEMFILE");			break;
		case WSAENOBUFS:		strcpy(bufLog, "WSAENOBUFS");			break;
		case WSAENOTSOCK:		strcpy(bufLog, "WSAENOTSOCK");			break;
		case WSAEOPNOTSUPP:		strcpy(bufLog, "WSAEOPNOTSUPP");		break;
		default : return;
	}
	
	printf ("%s\n", bufLog) ;
}

void	CListenServer::SetNetEvent()
{
	m_wsaEvent = WSACreateEvent(); 
	WSAEventSelect(m_sSocket, m_wsaEvent, FD_ACCEPT);  
}

BOOL	CListenServer::Init()
{
	WSADATA wdata;
	if (WSAStartup(MAKEWORD(2,2), &wdata) == SOCKET_ERROR)
	{
		// err msg
		goto Err00;		
	}

	if ((m_sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
	{
		// err msg
		goto Err01;
	}

	SOCKADDR_IN		sinSvrSock; 
	sinSvrSock.sin_family = AF_INET;
	sinSvrSock.sin_addr.s_addr = htonl(INADDR_ANY);
//	sinSvrSock.sin_addr.s_addr = inet_addr(g_szThisServerIP); 
	sinSvrSock.sin_port = htons(g_nThisServerPort);

	if (bind(m_sSocket, (SOCKADDR *)&sinSvrSock, sizeof(sinSvrSock)) == SOCKET_ERROR)
	{
		// err msg
		goto Err02;
	}

	if (listen(m_sSocket, 5) == SOCKET_ERROR)
	{
		// err msg
		goto Err02;
	}

	if (BeginThread() == FALSE)
	{
		// err msg
		goto Err02;
	}

	return TRUE;


Err02:

	ReportWSAErr();

Err01:
	
	closesocket(m_sSocket);

Err00:

	WSACleanup();

	return FALSE;
}


void	CListenServer::LoopProc()
{
	SetNetEvent();

	CLoopThread::LoopProc();

	WSACloseEvent(m_wsaEvent);
}


void	CListenServer::Process()
{
	int					ClientLen;
	SOCKADDR_IN			ClinetAddr; 
	SOCKET				ClientSock;
	
	if (WSAWaitForMultipleEvents(1, &m_wsaEvent, FALSE, 0, TRUE) == WSA_WAIT_EVENT_0)
	{
		WSAEnumNetworkEvents(m_sSocket, m_wsaEvent, &m_netEvent);
		if (m_netEvent.lNetworkEvents & FD_ACCEPT)
		{
			ClientLen = sizeof(ClinetAddr);
			if ((ClientSock = accept(m_sSocket, (SOCKADDR *)&ClinetAddr, &ClientLen)) != INVALID_SOCKET)
			{
				// S2M_SVR_LOGIN 阑 措扁窍绰 辑滚俊 眠啊 
				if (GateManage.NewStandbyServer(ClientSock) == FALSE)
				{
					closesocket(ClientSock);
				}
			}
		}
	}
}

void	CListenServer::OnClose()
{
	CLoopThread::CloseThread();

	closesocket(m_sSocket);
	WSACleanup();
}

⌨️ 快捷键说明

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