init
This commit is contained in:
233
server/GateServer/SockProcess.cpp
Normal file
233
server/GateServer/SockProcess.cpp
Normal file
@@ -0,0 +1,233 @@
|
||||
|
||||
#include "StdAfx.h"
|
||||
#include "DataProcess.h"
|
||||
#include "SockProcess.h"
|
||||
|
||||
|
||||
|
||||
CRunSockProcesser::CRunSockProcesser()
|
||||
{
|
||||
m_RunSockType = rsUndefined;
|
||||
m_boStoping = TRUE;
|
||||
|
||||
m_ListenSocket = INVALID_SOCKET;
|
||||
m_BindAddr.sin_family = AF_INET;
|
||||
m_BindAddr.sin_addr.s_addr = 0;
|
||||
m_BindAddr.sin_port = 0;
|
||||
m_pDataProcesser = NULL;
|
||||
m_SessionFullTick = 0;
|
||||
}
|
||||
|
||||
CRunSockProcesser::~CRunSockProcesser()
|
||||
{
|
||||
Stop();
|
||||
}
|
||||
|
||||
VOID CRunSockProcesser::GotError(LPCSTR sErrorFn, LPCSTR sErrAPI, const INT ErrorCode)
|
||||
{
|
||||
OutputMsg( rmError, "CRunSockProcesse::%s Got Error %d on api \"%s\"", sErrorFn, ErrorCode, sErrAPI );
|
||||
}
|
||||
|
||||
|
||||
BOOL CRunSockProcesser::InitAcceptSocket()
|
||||
{
|
||||
m_ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_IP );
|
||||
if ( m_ListenSocket == INVALID_SOCKET )
|
||||
{
|
||||
GotError( __FUNCTION__, "socket", WSAGetLastError() );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
char optval = 1;
|
||||
#else
|
||||
int optval = 1;
|
||||
#endif
|
||||
|
||||
if (setsockopt(m_ListenSocket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == SOCKET_ERROR) {
|
||||
GotError( __FUNCTION__, "setsockopt", WSAGetLastError() );
|
||||
//assert(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( SOCKET_ERROR == bind( m_ListenSocket, (struct sockaddr*)&m_BindAddr, sizeof(m_BindAddr) ) )
|
||||
{
|
||||
GotError( __FUNCTION__, "socket", WSAGetLastError() );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( SOCKET_ERROR == listen( m_ListenSocket, 5 ) )
|
||||
{
|
||||
GotError( __FUNCTION__, "listen", WSAGetLastError() );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID CRunSockProcesser::UninitAcceptSocket()
|
||||
{
|
||||
if ( m_ListenSocket != INVALID_SOCKET )
|
||||
{
|
||||
GotError( __FUNCTION__, "close " , WSAGetLastError());
|
||||
closesocket( m_ListenSocket );
|
||||
m_ListenSocket = INVALID_SOCKET;
|
||||
}
|
||||
}
|
||||
|
||||
VOID CRunSockProcesser::NewSession()
|
||||
{
|
||||
SOCKET nSocket;
|
||||
SOCKADDRIN sRemote;
|
||||
socklen_t nRemoteSize, nErr;
|
||||
u_long uBlock;
|
||||
PRUNGATEUSERSESSION pSession;
|
||||
|
||||
nRemoteSize = sizeof(sRemote);
|
||||
//监听
|
||||
nSocket = accept( m_ListenSocket, (sockaddr*)&sRemote, &nRemoteSize );
|
||||
if ( nSocket == INVALID_SOCKET )
|
||||
{
|
||||
GotError( __FUNCTION__, "accept", WSAGetLastError() );
|
||||
return;
|
||||
}
|
||||
|
||||
//用户队列满后一段时间内不接受新连接
|
||||
if ( _getTickCount() < m_SessionFullTick )
|
||||
{
|
||||
closesocket( nSocket );
|
||||
GotError( __FUNCTION__, " _getTickCount() < m_SessionFullTick", WSAGetLastError() );
|
||||
return;
|
||||
}
|
||||
|
||||
//建立一个session,如果session队列满了,记录时间,在10秒内不能接受新的连接
|
||||
if ( !(pSession = m_pDataProcesser->NewSession( nSocket, sRemote )) )
|
||||
{
|
||||
closesocket( nSocket );
|
||||
GotError( __FUNCTION__, "用户队列已经满了。", ERROR_SUCCESS );
|
||||
m_SessionFullTick = _getTickCount() + 10 * 1000;
|
||||
return;
|
||||
}
|
||||
|
||||
//设置新的socket连接为允许非阻塞模式
|
||||
uBlock = 1;
|
||||
nErr = ioctlsocket( nSocket, FIONBIO, &uBlock );
|
||||
if ( SOCKET_ERROR == nErr )
|
||||
{
|
||||
closesocket( nSocket );
|
||||
GotError( __FUNCTION__, "ioctlsocket", WSAGetLastError() );
|
||||
return;
|
||||
}
|
||||
|
||||
int bnodelay = 1;
|
||||
nErr = ::setsockopt(nSocket, IPPROTO_TCP, TCP_NODELAY, (const char *)&bnodelay, sizeof(bnodelay));
|
||||
if (SOCKET_ERROR == nErr)
|
||||
{
|
||||
GotError( __FUNCTION__, "setsockopt", WSAGetLastError() );
|
||||
return;
|
||||
}
|
||||
|
||||
/*AdjustSocketSendBufSize( nSocket, 32 * 1024 );*/
|
||||
}
|
||||
|
||||
BOOL CRunSockProcesser::AdjustSocketSendBufSize(SOCKET s, INT nSize)
|
||||
{
|
||||
int nOldSize, nErr;
|
||||
socklen_t nSizeLen;
|
||||
nSizeLen = sizeof(nOldSize);
|
||||
nErr = getsockopt( s, SOL_SOCKET, SO_SNDBUF, (char*)&nOldSize, &nSizeLen );
|
||||
if ( nErr != SOCKET_ERROR )
|
||||
{
|
||||
if ( nOldSize < nSize )
|
||||
{
|
||||
nOldSize = nSize;
|
||||
if ( setsockopt( s, SOL_SOCKET, SO_SNDBUF, (char*)&nOldSize, nSizeLen ) == SOCKET_ERROR )
|
||||
{
|
||||
GotError( __FUNCTION__, "getsockopt", WSAGetLastError() );
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
GotError( __FUNCTION__, "getsockopt", WSAGetLastError() );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID CRunSockProcesser::SetBindAddress(LPCSTR sAddress)
|
||||
{
|
||||
m_BindAddr.sin_addr.s_addr = inet_addr(sAddress);
|
||||
}
|
||||
|
||||
VOID CRunSockProcesser::SetBindPort(INT nPort)
|
||||
{
|
||||
m_BindAddr.sin_port = htons(nPort);
|
||||
}
|
||||
|
||||
LPCSTR CRunSockProcesser::GetBindAddress()
|
||||
{
|
||||
return inet_ntoa(m_BindAddr.sin_addr);
|
||||
}
|
||||
|
||||
INT CRunSockProcesser::GetBindPort()
|
||||
{
|
||||
return htons(m_BindAddr.sin_port);
|
||||
}
|
||||
|
||||
RUNSOCKTYPE CRunSockProcesser::GetRunSockType()
|
||||
{
|
||||
return m_RunSockType;
|
||||
}
|
||||
|
||||
CRunDataProcesser* CRunSockProcesser::GetDataProcesser()
|
||||
{
|
||||
return m_pDataProcesser;
|
||||
}
|
||||
|
||||
CRunDataProcesser* CRunSockProcesser::SetDataProcesser(CRunDataProcesser *pDataProcesser)
|
||||
{
|
||||
CRunDataProcesser *pOldProcess = m_pDataProcesser;
|
||||
m_pDataProcesser = pDataProcesser;
|
||||
return pOldProcess;
|
||||
}
|
||||
|
||||
BOOL CRunSockProcesser::InitBase()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
WSADATA WSAData;
|
||||
int nErr;
|
||||
|
||||
nErr = WSAStartup( MAKEWORD(2, 2), &WSAData );
|
||||
if ( nErr )
|
||||
{
|
||||
GotError( __FUNCTION__, "WSAStartup", nErr );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
timeBeginPeriod( 1 );
|
||||
#endif
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID CRunSockProcesser::UninitBase()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
timeEndPeriod( 1 );
|
||||
WSACleanup();
|
||||
#endif
|
||||
}
|
||||
|
||||
BOOL CRunSockProcesser::Start()
|
||||
{
|
||||
m_boStoping = FALSE;
|
||||
m_SessionFullTick = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID CRunSockProcesser::Stop()
|
||||
{
|
||||
m_boStoping = TRUE;
|
||||
}
|
||||
Reference in New Issue
Block a user