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

📄 cmysocket.cpp

📁 这是我做的一个iocp的服务器端的测试代码
💻 CPP
字号:
#include "StdAfx.h"
#include "CMySocket.h"

CMySocket::CMySocket(void)
: m_socket( INVALID_SOCKET )
{
}
CMySocket::CMySocket( SOCKET theSocket )
: m_socket( theSocket )
{
	if ( INVALID_SOCKET == m_socket )
	{
		throw_NWExceptionC( "CSocket::CSocket()",  WSAENOTSOCK );
	}
}

CMySocket::~CMySocket(void)
{
	if ( INVALID_SOCKET != m_socket )
	{
		try
		{
			AbortiveClose();
		}
		catch(...)
		{
			Trace( "CSocket::~CSocket() exception!" );
		}
	}
}


void CMySocket::Attach( SOCKET theSocket )
{
	MYEXCEPTIONFUNC_START();
	AbortiveClose();

	m_socket = theSocket;
	MYEXCEPTIONFUNC_NOREV_END("CMySocket::Attach");
}

SOCKET CMySocket::Detatch()
{
	MYEXCEPTIONFUNC_START();
	SOCKET theSocket = m_socket;

	m_socket = INVALID_SOCKET;

	return theSocket;
	MYEXCEPTIONFUNC_NOREV_END("CMySocket::Bind");
	return 0 ;
}

void CMySocket::Close()
{
	MYEXCEPTIONFUNC_START();
	if ( 0 != ::closesocket( m_socket ) )
	{
		throw_NWExceptionC("CSocket::Close()", ::WSAGetLastError() );
	}
	MYEXCEPTIONFUNC_NOREV_END("CMySocket::Bind");
}

void CMySocket::AbortiveClose()
{
	MYEXCEPTIONFUNC_START();
	if (INVALID_SOCKET == m_socket)
	{
		return ;
	}
	LINGER lingerStruct;

	lingerStruct.l_onoff = 1;
	lingerStruct.l_linger = 0;

	if ( SOCKET_ERROR == ::setsockopt( m_socket, 
		SOL_SOCKET, 
		SO_LINGER, 
		( char * )&lingerStruct, 
		sizeof( lingerStruct ) ) )
	{
		throw_NWExceptionC("CSocket::AbortiveClose()" , ::WSAGetLastError() );
	}

	Close();
	MYEXCEPTIONFUNC_NOREV_END("CMySocket::Bind");
}

void CMySocket::Shutdown( int how )
{
	MYEXCEPTIONFUNC_START();
	if ( 0 != ::shutdown( m_socket, how ) )
	{
		throw_NWExceptionC(" CSocket::Shutdown()" , ::WSAGetLastError() );
	}
	MYEXCEPTIONFUNC_NOREV_END("CMySocket::Bind");
}

void CMySocket::Listen( int backlog )
{
	MYEXCEPTIONFUNC_START();
	if ( SOCKET_ERROR == ::listen( m_socket, backlog ) )
	{
		throw_NWExceptionC("CSocket::Listen()" , ::WSAGetLastError() );
	}
	MYEXCEPTIONFUNC_NOREV_END("CMySocket::Bind");
}

void CMySocket::Bind(USHORT nBindPort)
{
	MYEXCEPTIONFUNC_START();
    sockaddr_in BindAddr ;
	BindAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	BindAddr.sin_family = AF_INET ;
	BindAddr.sin_port = htons(nBindPort);
	Bind(BindAddr);
	MYEXCEPTIONFUNC_NOREV_END("CMySocket::Bind");
}

void CMySocket::Bind( const SOCKADDR_IN &address )
{
	MYEXCEPTIONFUNC_START();
	if ( SOCKET_ERROR == ::bind( m_socket, 
		reinterpret_cast< struct sockaddr * >( const_cast< SOCKADDR_IN * >( &address ) ),
		sizeof( SOCKADDR_IN ) ) )
	{
		throw_NWExceptionC("CSocket::Bind()" , ::WSAGetLastError() );
	}
	MYEXCEPTIONFUNC_NOREV_END("CMySocket::Bind");
}

void CMySocket::Bind( const struct sockaddr &address, size_t addressLength )
{
	MYEXCEPTIONFUNC_START();
	if ( SOCKET_ERROR == ::bind( m_socket, 
		const_cast< struct sockaddr * >( &address ),
		addressLength ) )
	{
		throw_NWExceptionC("CSocket::Bind()" , ::WSAGetLastError() );
	}
	MYEXCEPTIONFUNC_NOREV_END("CMySocket::Bind");
}

void CMySocket::Connect( const SOCKADDR_IN &address )
{
	MYEXCEPTIONFUNC_START();
	if ( SOCKET_ERROR == ::connect( m_socket, 
		reinterpret_cast< struct sockaddr * >( const_cast<SOCKADDR_IN *>( &address ) ), 
		sizeof( SOCKADDR_IN ) ) )
	{
		throw_NWExceptionC("CSocket::Connect()" , ::WSAGetLastError() );
	}
	MYEXCEPTIONFUNC_NOREV_END("CMySocket::Bind");
}

void CMySocket::Connect( const struct sockaddr &address, size_t addressLength )
{
	MYEXCEPTIONFUNC_START();
	/*
	* Loss of precision (arg. no. 3) (unsigned int to int)
	*/
	if ( SOCKET_ERROR == ::connect( m_socket, 
		const_cast<struct sockaddr *>( &address ), 
		addressLength ) )
	{
		throw_NWExceptionC("CSocket::Connect()" , ::WSAGetLastError() );
	}
	MYEXCEPTIONFUNC_NOREV_END("CMySocket::Bind");
}

/*
* CSocket::InternetAddress
*/

CMySocket::InternetAddress::InternetAddress( unsigned long address, unsigned short port )
{
	/*
	* member 'sockaddr_in::sin_zero not initialised
	* ...
	*/

	sin_family = AF_INET;
	sin_port = htons( port );
	sin_addr.s_addr = htonl( address );  
}

CMySocket::InternetAddress::InternetAddress(
	const char * &addressToConnectServer,
	unsigned short port  )
{
	sin_family = AF_INET;
	sin_port = htons( port );
	sin_addr.s_addr = inet_addr( addressToConnectServer); 

	/*
	* member 'sockaddr_in::sin_zero not initialised
	*/
} 

⌨️ 快捷键说明

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