📄 cmysocket.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 + -