📄 serversocket.cpp
字号:
// ServerSocket.cpp: implementation of the CServerSocket class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SGIPGateWay.h"
#include "ServerSocket.h"
#include "helpfunc.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CServerSocket::CServerSocket()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 2, 2 );
WSAStartup( wVersionRequested, &wsaData );
mSocket = INVALID_SOCKET;
}
CServerSocket::~CServerSocket()
{
WSACleanup();
}
BOOL CServerSocket::StartServer(int nPort)
{
mnPort = nPort;
DWORD id;
mblnRuning = TRUE;
mhServer = CreateThread(NULL, NULL, ListenThread, (LPVOID)this, 0, &id);
return TRUE;
}
DWORD WINAPI CServerSocket::ListenThread(LPVOID lpParam)
{
CServerSocket *pServer = (CServerSocket *)lpParam;
struct sockaddr_in addrLocal, addrFrom;
int nFromLen;
//处理本地地址
addrLocal.sin_family = AF_INET;
*(int*)&addrLocal.sin_addr = INADDR_ANY;
addrLocal.sin_port = htons(pServer->mnPort);
//建立侦听socket
pServer->mSocket = socket(AF_INET, SOCK_STREAM, 0);
if( pServer->mSocket == INVALID_SOCKET )
return FALSE;
//绑定本地地址
if( bind(pServer->mSocket, (struct sockaddr*)&addrLocal, sizeof(addrLocal)) == SOCKET_ERROR )
return FALSE;
//启动侦听
if( listen(pServer->mSocket, SOMAXCONN) == SOCKET_ERROR )
return FALSE;
pServer->mnClientCount = 0;
SOCKET skt;
while(pServer->mblnRuning)
{
nFromLen = sizeof(addrFrom);
skt = accept(pServer->mSocket, (struct sockaddr*)&addrFrom, &nFromLen);
if( skt == INVALID_SOCKET )
{
//错误
pServer->OnError(WSAGetLastError());
Sleep(1000);
continue;
}
pServer->ClientAdd();
pServer->OnAccept(skt, inet_ntoa(addrFrom.sin_addr));
}
closesocket(pServer->mSocket);
pServer->mSocket = INVALID_SOCKET;
return 0;
}
void CServerSocket::ClientAdd()
{
mLock.Lock();
mnClientCount++;
mLock.Unlock();
}
void CServerSocket::ClientRelease()
{
mLock.Lock();
mnClientCount--;
mLock.Unlock();
}
int CServerSocket::GetClientCount()
{
int n;
mLock.Lock();
n = mnClientCount;
mLock.Unlock();
return n;
}
void CServerSocket::ShutdownServer()
{
TerminateThread(mhServer,0);
}
void CServerSocket::OnAccept(SOCKET sClientSocket, char *strClientIP)
{
}
void CServerSocket::OnError(int nErrorCode)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -