亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? socksvr.cpp

?? 一套linux下的C++開發庫
?? CPP
字號:
/***************************************************************************                          socksvr.cpp  -  description                             -------------------    begin                : Fri Jul 20 2001    copyright            : (C) 2001 by Mark    email                : alben@yeah.net ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include <errno.h>#include <sys/types.h>#include <sys/wait.h>#include <setjmp.h>#include "exception.h"#include "socksvr.h"#include "etc.h"CNBTcpSvr::CNBTcpSvr(const CInetAddress& stInetAddr, tcport_t tPort, int iBufSize,		int iMaxClients, int iTimeout, int iWaitTime)		: CTcpSocket(stInetAddr, tPort){	m_iBufSize = iBufSize;	m_iMaxClients = iMaxClients;	m_iTimeout = iTimeout;	m_iWaitTime = iWaitTime;	m_bShutdown = false;		SetBlock(false);	Open();}CNBTcpSvr::CNBTcpSvr(const CUnixAddress& stUnixAddr, int iBufSize, int iMaxClients,		int iTimeout, int iWaitTime)		: CTcpSocket(stUnixAddr){	m_iBufSize = iBufSize;	m_iMaxClients = iMaxClients;	m_iTimeout = iTimeout;	m_iWaitTime = iWaitTime;	m_bShutdown = false;		SetBlock(false);	Open();}CNBTcpSvr::~CNBTcpSvr(){	CConnList::iterator i = m_stConnList.begin();	while (i != m_stConnList.end())		delete *i++;}void CNBTcpSvr::Run(){	while (true)	{		try		{			if (m_bShutdown)				break;							CheckConnTimeout();			CheckEvent();			OnCheck();		}		catch (CException& e)		{			if (!OnException(e))				break;		}	}}void CNBTcpSvr::CheckConnTimeout(){	if (m_iTimeout == 0)	//no timeout		return;			time_t tCurrTime = time(NULL);	CConnList::iterator i = m_stConnList.begin();	while (i != m_stConnList.end())	{		if (tCurrTime - (*i)->m_iLastAccessTime > m_iTimeout)	//timeout		{			delete (*i);			i = m_stConnList.erase(i);			continue;		}				i++;	}}void CNBTcpSvr::PrepareSelect(int& iMaxFd, fd_set& rdset, fd_set& wrset){	if (m_iSocket > iMaxFd)		iMaxFd = m_iSocket;	FD_SET(m_iSocket, &rdset);	CConnList::iterator i = m_stConnList.begin();	while (i != m_stConnList.end())	{		if ((*i)->m_pstTcpStream->SocketFd() > iMaxFd)			iMaxFd = (*i)->m_pstTcpStream->SocketFd();					if ((*i)->m_pstTcpStream->rdbuf()->out_waiting())			FD_SET((*i)->m_pstTcpStream->SocketFd(), &wrset);					FD_SET((*i)->m_pstTcpStream->SocketFd(), &rdset);		i++;	}}void CNBTcpSvr::CheckPendingConn(const fd_set& rdset){	if (FD_ISSET(m_iSocket, &rdset))	{		CTcpStream* p = new CTcpStream(m_iBufSize);		if (Accept(p) && m_stConnList.size() < m_iMaxClients)		{			CConn* pstConn = new CConn;			pstConn->m_iLastAccessTime = (int)time(NULL);			pstConn->m_pstTcpStream = p;			m_stConnList.push_back(pstConn);		}		else		{			delete p;		}	}}void CNBTcpSvr::CheckPendingRead(const fd_set& rdset){	CConnList::iterator i = m_stConnList.begin();	while (i != m_stConnList.end())	{		if (FD_ISSET((*i)->m_pstTcpStream->SocketFd(), &rdset))		{			(*i)->m_pstTcpStream->underflow();			if (!(*i)->m_pstTcpStream->good())			{				delete (*i);				i = m_stConnList.erase(i);				continue;			}			(*i)->m_iLastAccessTime = (int)time(NULL);			if (!OnRead(*((*i)->m_pstTcpStream)))			{				delete (*i);				i = m_stConnList.erase(i);				continue;						}		}				i++;	}	}void CNBTcpSvr::CheckPendingWrite(const fd_set& wrset){	CConnList::iterator i = m_stConnList.begin();	while (i != m_stConnList.end())	{		if (FD_ISSET((*i)->m_pstTcpStream->SocketFd(), &wrset))		{			(*i)->m_pstTcpStream->flush();			if (!(*i)->m_pstTcpStream->good())			{				delete (*i);				i = m_stConnList.erase(i);				continue;			}			(*i)->m_iLastAccessTime = (int)time(NULL);			if (!OnWrite(*((*i)->m_pstTcpStream)))			{				delete (*i);				i = m_stConnList.erase(i);				continue;						}		}				i++;	}	}void CNBTcpSvr::CheckEvent(){	struct timeval stTimeVal;	stTimeVal.tv_sec = m_iWaitTime;	stTimeVal.tv_usec = 0;	fd_set rdset, wrset;	FD_ZERO(&rdset);	FD_ZERO(&wrset);	int iMaxFd = -1;	PrepareSelect(iMaxFd, rdset, wrset);		int iRet = select(iMaxFd+1, &rdset, &wrset, NULL, &stTimeVal);	if (iRet == 0)	//timeout		return;			if (iRet < 0)	{		if (errno == EINTR)			return;		else			throw CNBTcpSvrException(strerror(errno), __FILE__, __LINE__);	}		CheckPendingConn(rdset);	CheckPendingRead(rdset);	CheckPendingWrite(wrset);}static sigjmp_buf s_ParentProcEnv;static sigjmp_buf s_ChildProcEnv;int CPreforkSvr::s_iMaxProcs;pid_t CPreforkSvr::s_atPId[CPreforkSvr::PROCESS_COUNT_HARD_LIMIT];static void OnParentProcBeKilled(int iSigNo){	siglongjmp(s_ParentProcEnv, 1);}static void OnChildProcEnd(int iSigNo){	pid_t tPId;	while ((tPId = waitpid(-1, NULL, WNOHANG)) > 0)	{		for (int iIndex = 0; iIndex < CPreforkSvr::s_iMaxProcs; iIndex++)		{			if (CPreforkSvr::s_atPId[iIndex] == tPId)				CPreforkSvr::s_atPId[iIndex] = -1;		}	}}static void OnChildProcBeKilled(int iSigNo){	siglongjmp(s_ChildProcEnv, 1);}CPreforkSvr::CPreforkSvr(key_t tKey, const char* sFileLockPath, int iMaxProcs, int iMaxIdleProcs,		int iMinIdleProcs, int iStartProcs, unsigned int uiCheckProcTimeval)		: m_stScoreBoard(tKey, PROCESS_COUNT_HARD_LIMIT),		  m_stLock(sFileLockPath){	if (iMaxProcs > PROCESS_COUNT_HARD_LIMIT)		throw CPreforkSvrException("\"MaxProcs\" cannot be greater than PROCESS_COUNT_HARD_LIMIT", __FILE__, __LINE__);			if (iMaxIdleProcs < iMinIdleProcs)		throw CPreforkSvrException("\"MinIdleProcs\" cannot be greater than \"MaxIdleProcs\"", __FILE__, __LINE__);			s_iMaxProcs = iMaxProcs;	m_iMaxIdleProcs = iMaxIdleProcs;	m_iMinIdleProcs = iMinIdleProcs;	m_iStartProcs = iStartProcs;	m_uiCheckProcTimeval = uiCheckProcTimeval;	for (int i = 0; i < PROCESS_COUNT_HARD_LIMIT; i++)		s_atPId[i] = (pid_t)-1;			m_iProcIndex = -1;}void CPreforkSvr::Run(){	Signal(SIGTERM, OnParentProcBeKilled, false);	Signal(SIGCHLD, OnChildProcEnd, true);	if (sigsetjmp(s_ParentProcEnv, 0))	{		AllWriteLockW();		KillAllChildSvrs();		AllUnlock();		return;	}		sigset_t tBlockSet, tOldSet;	sigemptyset(&tBlockSet);	sigaddset(&tBlockSet, SIGTERM);	sigaddset(&tBlockSet, SIGCHLD);			Sigprocmask(SIG_BLOCK, &tBlockSet, &tOldSet);		AllWriteLockW();	ForkChildSvrs(m_iStartProcs);	AllUnlock();	Sigprocmask(SIG_SETMASK, &tOldSet, NULL);		while (true)	{		unsigned int uiSleep = m_uiCheckProcTimeval;		while ((uiSleep = sleep(uiSleep)));		Sigprocmask(SIG_BLOCK, &tBlockSet, &tOldSet);		AllWriteLockW();		int iIdleSvrs = 0;		int iEmptySvrs = 0;		for (int iIndex = 0; iIndex < s_iMaxProcs; iIndex++)		{			if (m_stScoreBoard[iIndex] == CScoreBoard::S_IDLE)				iIdleSvrs++;							if (m_stScoreBoard[iIndex] == CScoreBoard::S_EMPTY && s_atPId[iIndex] < 0)				iEmptySvrs++;		}				if (iIdleSvrs > m_iMaxIdleProcs)			KillChildSvrs(iIdleSvrs - m_iMaxIdleProcs);					if (iIdleSvrs < m_iMinIdleProcs && iEmptySvrs > 0)			ForkChildSvrs(m_iMinIdleProcs - iIdleSvrs < iEmptySvrs ? m_iMinIdleProcs - iIdleSvrs : iEmptySvrs);				AllUnlock();		Sigprocmask(SIG_SETMASK, &tOldSet, NULL);	}}int CPreforkSvr::ForkChildSvrs(int iSvrs){	int iForkedSvrs = 0;	try	{		for (int iIndex = 0; iIndex < s_iMaxProcs; iIndex++)		{			if (iForkedSvrs >= iSvrs)				break;						if (m_stScoreBoard[iIndex] == CScoreBoard::S_EMPTY && s_atPId[iIndex] < 0)			{				pid_t tPId;				tPId = Fork();				if (tPId == 0)				{					try					{						m_iProcIndex = iIndex;											sigset_t tUnblockSet;						sigemptyset(&tUnblockSet);						sigaddset(&tUnblockSet, SIGTERM);						sigaddset(&tUnblockSet, SIGCHLD);						Sigprocmask(SIG_UNBLOCK, &tUnblockSet, NULL);										Signal(SIGTERM, OnChildProcBeKilled, false);						if (sigsetjmp(s_ChildProcEnv, 0))						{							ChildEnd();							exit(0);						}						SetChildIdle();						ChildRun();					}					catch (CException& e)					{						OnChildException(e);									}									ChildEnd();					exit(0);				}				iForkedSvrs++;				s_atPId[iIndex] = tPId;				m_stScoreBoard[iIndex] = CScoreBoard::S_BUSY;	//because of the lock this would run before child SetIdle()			}		}	}	catch (CException& e)	{		OnNoticeException(e);	}					return iForkedSvrs;}void CPreforkSvr::KillChildSvrs(int iSvrs){	int iKilledSvrs = 0;	for (int iIndex = 0; iIndex < s_iMaxProcs; iIndex++)	{		if (iKilledSvrs >= iSvrs)			break;					if (m_stScoreBoard[iIndex] == CScoreBoard::S_IDLE)		{			try			{				if (s_atPId[iIndex] > 0)				{					Kill(s_atPId[iIndex], SIGTERM);					iKilledSvrs++;				}				else				{					throw CPreforkSvrException("one child's state is IDLE but pid < 0", __FILE__, __LINE__);				}			}			catch (CException& e)			{				OnNoticeException(e);			}				}	}}void CPreforkSvr::KillAllChildSvrs(){	for (int iIndex = 0; iIndex < s_iMaxProcs; iIndex++)	{		if (m_stScoreBoard[iIndex] != CScoreBoard::S_EMPTY)		{			try			{				if (s_atPId[iIndex] > 0)					Kill(s_atPId[iIndex], SIGTERM);				else					throw CPreforkSvrException("one child's state is NOT EMPTY but pid < 0", __FILE__, __LINE__);			}			catch (CException& e)			{				OnNoticeException(e);			}				}	}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本不卡一区二区| 亚洲精品亚洲人成人网在线播放| 久久电影网站中文字幕| 日韩午夜中文字幕| 国产精品一区专区| 亚洲欧美综合在线精品| 色综合欧美在线视频区| 亚洲国产视频a| 欧美电影免费观看高清完整版在线| 精品亚洲porn| 亚洲国产精品传媒在线观看| 91免费国产在线观看| 亚洲va国产va欧美va观看| 欧美xfplay| 成人一区二区在线观看| 一区二区欧美国产| 91精品国产综合久久精品| 国产一区二区按摩在线观看| 综合分类小说区另类春色亚洲小说欧美| 色婷婷亚洲综合| 久久se这里有精品| 1区2区3区精品视频| 欧美一级专区免费大片| 懂色av一区二区三区免费看| 亚洲影院在线观看| 久久影院午夜论| 91久久精品一区二区三| 国内精品国产三级国产a久久| 亚洲欧美日韩中文播放| 日韩一二三区视频| 95精品视频在线| 蜜臀av一区二区| 亚洲欧美另类久久久精品2019| 日韩一卡二卡三卡| 91美女福利视频| 韩国在线一区二区| 亚洲成精国产精品女| 国产欧美中文在线| 欧美福利一区二区| 99久久久国产精品| 国精产品一区一区三区mba桃花| 曰韩精品一区二区| 亚洲国产精品二十页| 欧美一二三区在线| 欧美中文字幕一二三区视频| 国产一区二区三区久久久| 亚洲第一久久影院| 中文字幕视频一区| 久久精品夜色噜噜亚洲aⅴ| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲精品成人天堂一二三| 欧美电视剧在线看免费| 欧美日韩在线三级| 91网站最新网址| 国产精品99久久不卡二区| 丝袜国产日韩另类美女| 一区二区三区在线看| 国产日韩欧美精品一区| 日韩欧美一区二区三区在线| 欧美精品久久一区二区三区| 一本到不卡精品视频在线观看| 国产69精品久久久久777| 久久精品99久久久| 美女国产一区二区| 日韩精品国产欧美| 亚洲高清视频的网址| 夜色激情一区二区| 一区二区三区在线视频免费 | 亚洲欧美中日韩| 国产婷婷色一区二区三区在线| 日韩精品一区二区三区三区免费| 91丝袜美腿高跟国产极品老师 | 精品国产精品网麻豆系列 | 91蝌蚪国产九色| 成人高清视频在线观看| 国产v综合v亚洲欧| 成人综合激情网| 成人av免费在线| 99国产精品国产精品久久| 99久精品国产| 欧洲在线/亚洲| 欧美日韩免费观看一区二区三区| 欧美在线啊v一区| 在线亚洲人成电影网站色www| 欧美中文字幕久久| 在线播放视频一区| 日韩女同互慰一区二区| 欧美v国产在线一区二区三区| 久久午夜免费电影| 国产精品美女www爽爽爽| 国产精品卡一卡二| 亚洲激情图片小说视频| 视频在线观看国产精品| 美国十次综合导航| 国产成人在线观看免费网站| 成人av在线播放网站| 色婷婷综合视频在线观看| 欧美日韩国产三级| 精品国产乱码久久久久久闺蜜| 久久久综合网站| 亚洲欧美色图小说| 丝袜亚洲另类欧美综合| 国产黄色精品网站| 91麻豆免费看| 日韩精品中文字幕在线一区| 中文字幕高清不卡| 午夜婷婷国产麻豆精品| 韩国理伦片一区二区三区在线播放| 国产成人精品亚洲午夜麻豆| 91搞黄在线观看| 这里只有精品电影| 国产欧美日韩亚州综合| 亚洲成人av电影在线| 国产乱码精品1区2区3区| 日本韩国欧美三级| 精品国产制服丝袜高跟| 亚洲精品欧美综合四区| 久久国产精品99精品国产| 不卡电影一区二区三区| 日韩欧美一区二区免费| 亚洲色图视频免费播放| 久久精品噜噜噜成人88aⅴ| eeuss鲁片一区二区三区在线观看| 欧美日本国产视频| 国产精品久久久一本精品 | 美女久久久精品| 91麻豆精品秘密| 精品久久国产字幕高潮| 亚洲综合小说图片| 国产精品一区二区三区网站| 欧美日韩视频在线一区二区| 中文字幕第一区综合| 另类欧美日韩国产在线| 色94色欧美sute亚洲13| 国产校园另类小说区| 午夜国产精品影院在线观看| 成人晚上爱看视频| 久久综合久久鬼色中文字| 丝袜国产日韩另类美女| 日本精品视频一区二区| 国产精品高潮呻吟| 国产宾馆实践打屁股91| 日韩欧美综合在线| 日韩二区三区四区| 欧洲av一区二区嗯嗯嗯啊| 中文字幕一区二区三区不卡| 国产老肥熟一区二区三区| 日韩午夜激情电影| 日韩主播视频在线| 欧美私模裸体表演在线观看| 自拍视频在线观看一区二区| 国产河南妇女毛片精品久久久| 精品国产一区二区三区忘忧草 | 日本免费新一区视频| 欧美色综合影院| 亚洲精品v日韩精品| 99精品一区二区三区| 欧美国产欧美综合| 国产精品一区专区| 日本一区二区三区在线不卡| 国产真实乱对白精彩久久| 精品国产一区二区三区久久久蜜月 | 91小视频免费观看| 欧美激情综合网| 99综合影院在线| 1区2区3区欧美| 97精品久久久午夜一区二区三区| 国产精品黄色在线观看| av激情成人网| 亚洲乱码一区二区三区在线观看| 99re热这里只有精品免费视频| 国产精品久线观看视频| 97超碰欧美中文字幕| 亚洲精品国产第一综合99久久| 一本大道久久a久久综合| 亚洲精品国产a| 7777精品伊人久久久大香线蕉的| 日本欧美肥老太交大片| 337p日本欧洲亚洲大胆精品| 国产福利不卡视频| 亚洲男人的天堂网| 欧美日韩精品系列| 久久精品国产99久久6| 亚洲国产精品高清| 色屁屁一区二区| 视频一区中文字幕| 欧美成人r级一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品久久久爽爽爽麻豆色哟哟| aaa国产一区| 亚洲福利一区二区三区| 精品国产伦一区二区三区免费| 国产传媒日韩欧美成人| 一区二区视频在线看| 欧美一区二区三区不卡| 国产传媒日韩欧美成人| 亚洲制服丝袜av| 欧美大片免费久久精品三p| 成人福利视频在线看| 亚洲成a人片在线不卡一二三区|