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 + -
显示快捷键?