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

📄 cmserversocket.cpp

📁 Soul的源代码,类似于劲舞团之类的游戏
💻 CPP
字号:
#include <WinSock2.h>
#include <MatrixCore/System/CMObject.h>
#include <MatrixCore/System/CMException.h>
#include <MatrixCore/System/CMDebug.h>
#include <MatrixCore/Network/CMServerSocket.h>
#include "CMInetAddress.h"

#include <MatrixCore/Pattern/CMSingleton.h>

using namespace MatrixCore::Pattern;
//CMSingleton<CMDebug>::getInstance()
using namespace MatrixCore::Network;



CMServerSocket::CMServerSocket()
	: m_hListenSocket( INVALID_SOCKET )
{
}

CMServerSocket::~CMServerSocket()
{
	//if( m_hListenSocket != INVALID_SOCKET )
	//{
	//	::closesocket( m_hListenSocket );
	//	m_hListenSocket = INVALID_SOCKET;
	//}
//	Close();

}

bool CMServerSocket::Initialize( CMString stIPAddr, int iPortNo, int backlogCount )
{
	WSADATA wsaData;

	//扩加 2.0滚怜 荤侩
	if( ::WSAStartup( MAKEWORD( 2, 2 ), &wsaData ) != 0 )
		return false;

	if( wsaData.wVersion != MAKEWORD( 2, 2 ) )
	{
		::WSACleanup();

		return false;
	}


	struct sockaddr_in sockAddr;
	char* pBuf = NULL;
	bool reuse = true, keepAlive = true;

	::ZeroMemory( &sockAddr, sizeof( sockAddr ) );
	
	pBuf = ( char* )stIPAddr.getBuffer();
	
	//IP 绢靛饭胶啊 NULL捞扼搁 磊扁 磊脚 哪磐狼 酒捞乔甫 持绢霖促..
	if(stIPAddr == "")
	{
		stIPAddr = CMInetAddress::GetHostAddress();
		pBuf = ( char* )stIPAddr.getBuffer();
	}
	
	sockAddr.sin_family			= AF_INET;
	sockAddr.sin_addr.s_addr	= ::inet_addr( pBuf );
	sockAddr.sin_port			= ::htons( iPortNo );

	m_hListenSocket = ::socket( AF_INET, SOCK_STREAM, 0 );
	if( m_hListenSocket == INVALID_SOCKET )
	{
		::WSACleanup();

		return false;
	}
	::setsockopt( m_hListenSocket, SOL_SOCKET, SO_REUSEADDR, ( char* )&reuse, sizeof( reuse ) );
	::setsockopt( m_hListenSocket, SOL_SOCKET, SO_KEEPALIVE, ( char* )&keepAlive, sizeof( keepAlive ) );

	unsigned long argp = 1;

	::ioctlsocket( m_hListenSocket, FIONBIO, &argp );
int err = bind(m_hListenSocket, ( struct sockaddr * )&sockAddr, sizeof( sockAddr ) );
	if(  SOCKET_ERROR == err )
	{
		//官牢爹 角菩..
		int err = GetLastError();
		CMSingleton<CMDebug>::getInstance()->output("%s(%d)AcceptContext() Error(%d)",__FILE__,__LINE__,err);
		WSACleanup();
		return false;
	}

	if( SOCKET_ERROR == listen( m_hListenSocket, backlogCount ) )
	{
		int err = GetLastError();
		CMSingleton<CMDebug>::getInstance()->output("%s(%d)listen() Error(%d)",__FILE__,__LINE__,err);
		//listenning 角菩..
		WSACleanup();
		return false;
	}

	return true;
}

bool CMServerSocket::Initialize( int iPortNo, int backlogCount )
{
	return Initialize( CMInetAddress::GetHostAddress(), iPortNo, backlogCount );
}

void CMServerSocket::Close()
{
	//if( m_hListenSocket != INVALID_SOCKET )
	//{
	//	::shutdown( m_hListenSocket, SD_BOTH );
	//	::closesocket( m_hListenSocket );
	//	m_hListenSocket = INVALID_SOCKET;
	//}

	::WSACleanup();
}

SOCKET CMServerSocket::AcceptConnection( struct timeval timeout, struct sockaddr FAR* addr ) throw ( CMSocketErrorException* )
{
	fd_set fds;
	int len = sizeof( struct sockaddr );

	FD_ZERO( &fds );
	FD_SET( m_hListenSocket, &fds );

	if( ::select( 0, &fds, 0, 0, &timeout ) == SOCKET_ERROR )
		throw ( new CMSocketErrorException() );

	if( FD_ISSET( m_hListenSocket, &fds ) )
		return ::accept( m_hListenSocket, addr, &len );

	return INVALID_SOCKET;
}


LPTSTR CMServerSocket::GetMyIP()
{
	WSADATA wsaData;
	
	if( ::WSAStartup( MAKEWORD( 2, 2 ), &wsaData ) != 0 )
		return NULL;
    char host[15] ;
     HOSTENT* hostent = NULL;

     gethostname(host, 15);
     hostent = ::gethostbyname(host);
     memcpy(m_MyIP, inet_ntoa(*(struct in_addr*)
             *hostent->h_addr_list), 20);
	 
	 ::WSACleanup();

	 return m_MyIP ;
}

⌨️ 快捷键说明

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