⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serversocket.cpp

📁 一个SGIP网关的程序源码.vc代码
💻 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 + -