net_session.cpp

来自「网络泡泡被.net管理」· C++ 代码 · 共 236 行

CPP
236
字号
                  // NET_Session.cpp: implementation of the NET_Session class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "net_lib.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

NET_Session::NET_Session(uint32 uid)
{
	m_uid	= uid;
	m_uid_opposite	= 0;
	m_time_set	= 0;
	m_net_delay	= 0;

	m_connect_check_time	= CONNECT_CHECK_TIME;

	m_ptr_net_socket	= NULL;

	m_index_send_check	= IC_BEGIN;
	m_index_recv_check	= IC_BEGIN;
	m_ric_seq			= 0;
	INIT_CS(&m_lock_ic_image);
}



NET_Session::~NET_Session()
{
	DELETE_CS(&m_lock_ic_image);

}

void NET_Session::time_set(time_t time)
{
	m_time_set	= time;
}

bool NET_Session::test_time_out(time_t time, time_t time_out)
{
	if(time>m_time_set && time-m_time_set>time_out)
	{
		return true;
	}
	return false;
}

time_t NET_Session::time_get()
{
	return m_time_set;
}

void NET_Session::Connect()
{
	if(m_ptr_net_socket==NULL)
		return;
	//connect
	NET_Packet*		pPacket	= new NET_Packet;
//	pPacket->setUID(m_uid_opposite);		//对话者的所在地的会话id,如果不确定,则设为0,表示主动连接对方,等待对方回复
	pPacket->setCmd(NLIBP_CONNECT);				//连接命令
//	pPacket->write32(m_uid);				//本地分配的会话id
	//其他的信息
	//发送
//	m_ptr_net_socket->PushSendPacket(m_uid, pPacket);
	this->send(pPacket);

}

void NET_Session::Disconnect()
{
	if(m_ptr_net_socket==NULL)
		return;
	//connect
	NET_Packet*		pPacket	= new NET_Packet;
	pPacket->setCmd(NLIBP_DISCONNECT);				//马上通知对方断开连接
	this->send(pPacket);

}

void NET_Session::Check_connect(time_t tm)
{
	//检测上次通信到现在所经过的时间,如果超过测试值,则向接受表中送一个数据包,等待处理和转发
	if(m_ptr_net_socket==NULL)
		return ;
//	time_t time = Sys_GetTime();
	if(tm< m_time_set)
	{
		m_time_set	= tm;
	}
	else if(tm - m_time_set>m_connect_check_time)
	{
		NET_Packet* pPacket = new NET_Packet;
		pPacket->setCmd(NLIBP_CHECK_CONNECT);
		pPacket->setUID(0);//it->second->getUID_opposite());
		pPacket->write32(m_uid);
		pPacket->write32(tm - m_time_set);
		pPacket->begin();
		m_ptr_net_socket->PushRecvPacket(pPacket, tm);
	}
}

void NET_Session::Ping()
{
	if(m_ptr_net_socket==NULL)
		return ;
	//测试会话连接延时
	NET_Packet* pPacket = new NET_Packet;
	pPacket->setCmd(NLIBP_PING);
	pPacket->write32(Sys_GetTime());
	pPacket->write32(m_net_delay);
	m_ptr_net_socket->PushSendPacket(m_uid, pPacket);
	
}


void NET_Session::mark_index(NET_Packet *ptr_packet)
{
	if(ptr_packet==NULL)
		return;
	ptr_packet->setIC(m_index_send_check);
	m_map_packet_image[m_index_send_check]	= ptr_packet;
	m_index_send_check++;
	if(m_index_send_check%16==0)
	{
		if(m_index_send_check>IC_END)
		{
			m_index_send_check	= IC_BEGIN;
		}
	}
}

bool NET_Session::check_index(NET_Packet *ptr_packet)
{
	if(ptr_packet==NULL)
		return true;
	if(ptr_packet->getIC()==IC_NULL)
	{
		return true;
	}
	else if(m_index_recv_check==ptr_packet->getIC())
	{
		m_index_recv_check++;
		if(m_index_recv_check%16==0)
		{
			NET_Packet*	pPacket	= new NET_Packet;
			pPacket->setCmd(NLIBP_IC_OK);
			pPacket->write16(m_index_recv_check);
			this->send(pPacket);
			if(m_index_recv_check>IC_END)
			{
				m_index_recv_check	= IC_BEGIN;
			}
		}
		return true;
	}
	else
	{
		return false;
	}
}

void NET_Session::Query_IC()
{
	//发送重发请求
	time_t tm = Sys_GetTime();
	//防止频繁重复地发这个请求
	if(tm-m_ric_seq>30 || tm<m_ric_seq)
	{
		m_ric_seq	= tm;
		NET_Packet*	pPacket	= new NET_Packet;
		pPacket->setCmd(NLIBP_IC_QUERY);
		pPacket->write16(m_index_recv_check);
		this->send(pPacket);
	}
}


void NET_Session::resend(uint16 ic)
{
	LOCK_CS(&m_lock_ic_image);
	std::map<uint16, NET_Packet*>::iterator	it = m_map_packet_image.find(ic);
	NET_Packet* pPacket = NULL;
	if(it!=m_map_packet_image.end())
	{
		pPacket	= it->second;
	}
	UNLOCK_CS(&m_lock_ic_image);
	if(pPacket)
	{
		this->send(pPacket);
		return;
	}

	pPacket	= new NET_Packet;
	pPacket->setIC(ic);
	pPacket->setCmd(NLIBP_IC_LOST);
//	packet.write16(ic);
	this->send(pPacket);
}

void NET_Session::clear_ic_image()
{
	LOCK_CS(&m_lock_ic_image);
	std::map<uint16, NET_Packet*>::iterator	it = m_map_packet_image.begin();
	if(it!=m_map_packet_image.end())
	{
		NET_Packet* pPacket = it->second;
		if(pPacket)
			delete(pPacket);
		it = m_map_packet_image.erase(it);
	}
	UNLOCK_CS(&m_lock_ic_image);
}

void NET_Session::update_ic_image(uint16 last_ic)
{
	std::map<uint16, NET_Packet*>::iterator	it = m_map_packet_image.begin();
//	NET_Packet* pPacket = NULL;
	while(it!=m_map_packet_image.end())
	{
		NET_Packet* pPacket	= it->second;
		int ic_d	= last_ic-pPacket->getIC();
		if(ic_d>0 && ic_d<16*100)
		{
			delete(pPacket);
			it	= m_map_packet_image.erase(it);
		}
		else
			it++;
	}
	
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?