예제 #1
0
파일: main.cpp 프로젝트: KrystianD/kdhome
	Program()
	{
		int r;
		r = socket1.init();
		socket1.setPort(10000);
		socket1.bind();
		socket1.setListener(this);
	}
예제 #2
0
ServiceManager::ServiceManager(uint32 _tcpAcptrSvcNum, uint32 _udpAcptrSvcNum, uint32 _sslAcptrSvcNum, 
							   uint32 _tcpSvcNum, uint32 _udpSvcNum, uint32 _sslSvcNum, 
							   uint32 _tcpAcptrThreadNum, uint32 _udpAcptrThreadNum, uint32 _sslAcptrThreadNum, uint32 _contextBase, 
							   uint32 _perClrTcpSktNum, uint32 _tcpSktClrNum, uint32 _perClrUdpSubSktNum, uint32 _udpSubSktClrNum, 
							   uint32 _perClrUdpSktNum, uint32 _udpSktClrNum, IFreeListShrPtr _packetFreeList, 
							   IPacketParserShrPtr _pktParser, bool _isIp4)
	: m_tcpAcptrSvcNum(_tcpAcptrSvcNum)
	, m_udpAcptrSvcNum(_udpAcptrSvcNum)
	, m_sslAcptrSvcNum(_sslAcptrSvcNum)
	, m_tcpSvcNum(_tcpSvcNum)
	, m_udpSvcNum(_udpSvcNum)
	, m_sslSvcNum(_sslSvcNum)
	, m_tcpAcptrThreadNum(_tcpAcptrThreadNum == 0 ? 1 : _tcpAcptrThreadNum)
	, m_udpAcptrThreadNum(_udpAcptrThreadNum == 0 ? 1 : _udpAcptrThreadNum)
	, m_sslAcptrThreadNum(_sslAcptrThreadNum == 0 ? 1 : _sslAcptrThreadNum)
	, m_perClrTcpSktNum(_perClrTcpSktNum == 0 ? 1 : _perClrTcpSktNum)
	, m_tcpSktClrNum(_tcpSktClrNum == 0 ? 1 : _tcpSktClrNum)
	, m_perClrUdpSubSktNum(_perClrUdpSubSktNum == 0 ? 1 : _perClrUdpSubSktNum)
	, m_udpSubSktClrNum(_udpSubSktClrNum == 0 ? 1 : _udpSubSktClrNum)
	, m_perClrUdpSktNum(_perClrUdpSktNum == 0 ? 1 : _perClrUdpSktNum)
	, m_udpSktClrNum(_udpSktClrNum == 0 ? 1 : _udpSktClrNum)

	, m_usingTcp(m_tcpAcptrSvcNum > 0 && m_tcpSvcNum > 0)
	, m_usingUdp(m_udpAcptrSvcNum > 0 && m_udpSvcNum > 0)
	, m_usingSSL(m_sslAcptrSvcNum > 0 && m_sslSvcNum > 0)

	, m_contexts(_contextBase)
	, m_netInfoMgr((m_tcpSvcNum+m_udpSvcNum+_contextBase)/3+1)

	, m_tcpAcptrSvcs(m_tcpAcptrSvcNum, NumChooser(0, (m_tcpAcptrSvcNum == 0 ? 1 : m_tcpAcptrSvcNum) - 1, 24249, false))
	, m_sslAcptrSvcs(m_sslAcptrSvcNum, NumChooser(0, (m_sslAcptrSvcNum == 0 ? 1 : m_sslAcptrSvcNum) - 1, 21139, false))
	, m_udpAcptrSvcs(m_udpAcptrSvcNum, NumChooser(0, (m_udpAcptrSvcNum == 0 ? 1 : m_udpAcptrSvcNum) - 1, 23449, false))
	, m_tcpSvcs(m_tcpSvcNum, NumChooser(0, (m_tcpSvcNum == 0 ? 1 : m_tcpSvcNum) - 1, 14249, false))
	, m_sslSvcs(m_sslSvcNum, NumChooser(0, (m_sslSvcNum == 0 ? 1 : m_sslSvcNum) - 1, 1222, false))
	, m_udpSvcs(m_udpSvcNum, NumChooser(0, (m_udpSvcNum == 0 ? 1 : m_udpSvcNum) - 1, 54249, false))
	, m_isIp4(_isIp4)
	, m_currMaxSnIndex(0)
{
	if (_pktParser)
	{
		m_pktParser = _pktParser;
	}
	else
	{
		m_pktParser = IPacketParserShrPtr(new PacketParser);
	}

	m_contexts.setHash();

	for (uint32 i=0; i<m_tcpAcptrSvcs.size(); ++i)
	{
		m_tcpAcptrSvcs[i] = new TcpAcceptorService(this, m_tcpAcptrThreadNum, m_isIp4);
	}
	for (uint32 i=0; i<m_sslAcptrSvcs.size(); ++i)
	{
		m_sslAcptrSvcs[i] = new SSLAcceptorService(this, m_sslAcptrThreadNum, m_isIp4);
	}
	for (uint32 i=0; i<m_udpAcptrSvcs.size(); ++i)
	{
		m_udpAcptrSvcs[i] = new UdpAcceptorService(this, m_udpAcptrThreadNum, m_isIp4);
	}
	for (uint32 i=0; i<m_tcpSvcs.size(); ++i)
	{
		m_tcpSvcs[i] = new TcpService(this, m_isIp4);
	}
	for (uint32 i=0; i<m_sslSvcs.size(); ++i)
	{
		m_sslSvcs[i] = new SSLService(this, m_isIp4);
	}
	for (uint32 i=0; i<m_udpSvcs.size(); ++i)
	{
		m_udpSvcs[i] = new UdpService(this, m_isIp4);
	}

	// create and init tcp socket free list
	IFreeListShrPtr tcpSktFl(new FreeList<TcpSocket>(m_tcpSktClrNum, m_perClrTcpSktNum));
	uint32 maxTcpNum = m_tcpSktClrNum*m_perClrTcpSktNum;
	for (uint32 ix=0, i=0; (i<maxTcpNum && m_usingTcp); ++i)
	{
		ix = (m_currMaxSnIndex+i) % m_tcpSvcs.size();
		TcpSocket* tcpSkt = (TcpSocket*)tcpSktFl->get(i);
		if (tcpSkt)
			tcpSkt->init(ISessionShrPtr(new Session(m_currMaxSnIndex+i, &m_netInfoMgr, m_currMaxSnIndex+i, 
													m_pktParser->create())), m_tcpSvcs[ix], this);
	}
	sTcpSktFList.set(tcpSktFl);
	if (m_usingTcp)
	{
		m_currMaxSnIndex += maxTcpNum;
	}

	// create and init udp sub socket free list
	IFreeListShrPtr udpSubSktFl(new FreeList<UdpSubSocket>(m_udpSubSktClrNum, m_perClrUdpSubSktNum));
	uint32 maxUdpSubNum = m_udpSubSktClrNum*m_perClrUdpSubSktNum;
	for (uint32 ix=0, i=0; (i<maxUdpSubNum && m_usingUdp); ++i)
	{
		ix = (m_currMaxSnIndex+i) % m_udpSvcs.size();
		UdpSubSocket* udpSubSkt = (UdpSubSocket*)udpSubSktFl->get(i);
		if (udpSubSkt)
			udpSubSkt->init(ISessionShrPtr(new Session(m_currMaxSnIndex+i, &m_netInfoMgr, m_currMaxSnIndex+i, 
													   m_pktParser->create())), m_udpSvcs[ix], this, m_isIp4);
	}
	sUdpSubSktFList.set(udpSubSktFl);
	if (m_usingUdp)
	{
		m_currMaxSnIndex += maxUdpSubNum;
	}

	// create and init udp socket free list
	IFreeListShrPtr udpSktFl(new FreeList<UdpSocket>(m_udpSktClrNum, m_perClrUdpSktNum));
	uint32 maxUdpNum = m_udpSktClrNum*m_perClrUdpSktNum;
	for (uint32 ix=0, i=0; (i<maxUdpNum && m_usingUdp); ++ix, ++i)
	{
		if (ix >= m_udpSvcs.size())
			ix = 0;
		UdpSocket* udpSkt = (UdpSocket*)udpSktFl->get(i);
		if (udpSkt)
			udpSkt->init(m_udpSvcs[ix], 0, m_isIp4);
	}
	sUdpSktFList.set(udpSktFl);

	if (_packetFreeList)
	{
		sPkFList.set(_packetFreeList);
	}
	else
	{
		sPkFList.set(IFreeListShrPtr(new FreeList<NetPacket>(10, 100)));
	}
}