DragonNest/Server/ServiceManager/SimpleServerFrame.cpp

110 lines
2.2 KiB
C++
Raw Permalink Normal View History

#include "stdafx.h"
#include <crtdbg.h>
#include "SimpleServerFrame.h"
CSimpleServerFrame::CSimpleServerFrame()
{
m_hThread = INVALID_HANDLE_VALUE;
m_hSocket = INVALID_SOCKET;
m_bAlive = true;
m_nPort = 0;
}
CSimpleServerFrame::~CSimpleServerFrame()
{
Close();
}
bool CSimpleServerFrame::Open(USHORT nAcceptPort)
{
if(m_hThread != INVALID_HANDLE_VALUE || m_hSocket != INVALID_SOCKET)
return false;
SOCKADDR_IN addr;
memset (&addr, 0, sizeof(addr));
m_hSocket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocket == INVALID_SOCKET)
return false;
addr.sin_family = AF_INET;
addr.sin_port = htons(nAcceptPort);
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if (::bind(m_hSocket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR)
{
closesocket(m_hSocket);
return false;
}
if (listen(m_hSocket, 0) == SOCKET_ERROR){
closesocket(m_hSocket);
return false;
}
m_hThread = (HANDLE) _beginthreadex(NULL, 0, _threadmain, (void*)this, 0, NULL);
return true;
}
void CSimpleServerFrame::Close()
{
while(m_hThread != INVALID_HANDLE_VALUE)
{
m_bAlive = false;
if (WaitForSingleObject(m_hThread, 2000) != WAIT_TIMEOUT)
{
CloseHandle(m_hThread);
m_hThread = INVALID_HANDLE_VALUE;
}
}
if (m_hSocket != INVALID_SOCKET)
{
closesocket(m_hSocket);
m_hSocket = INVALID_SOCKET;
}
}
void CSimpleServerFrame::ThreadMain()
{
char buffer[1024];
int readbytes, addrlen = sizeof(sockaddr_in);
unsigned long totalbytes;
SOCKADDR_IN addr;
fd_set fdset;
timeval tm;
while (m_bAlive && m_hSocket != INVALID_SOCKET)
{
tm.tv_sec = 0;
tm.tv_usec = INFINITE;
FD_ZERO(&fdset);
FD_SET(m_hSocket, &fdset);
if (select(FD_SETSIZE, (fd_set*)&fdset, (fd_set*)0, (fd_set*)0, &tm) != SOCKET_ERROR)
{
if( FD_ISSET( m_hSocket, &fdset ) )
{
SOCKET socket = accept(m_hSocket, (sockaddr*)&addr, &addrlen);
if (socket != INVALID_SOCKET)
{
ioctlsocket(m_hSocket, FIONREAD, &totalbytes);
readbytes = recv(socket, buffer, sizeof(buffer), 0);
Recv(&socket, buffer, readbytes);
closesocket(socket);
socket = INVALID_SOCKET;
}
}
}
Sleep(500);
}
}
unsigned int __stdcall CSimpleServerFrame::_threadmain(void * pParam)
{
((CSimpleServerFrame*)pParam)->ThreadMain();
return 0;
}