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