tcp_session.cpp

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

CPP
119
字号
// TCP_Session.cpp: implementation of the TCP_Session class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TCP.h"

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

TCP_Session::TCP_Session(uint32 uid, TCP_Socket* ptr_tcp_socket)
: NET_Session(uid)
{
	m_socket	= INVALID_SOCKET;
	m_ptr_net_socket	= ptr_tcp_socket;
	m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if (m_socket < 0) 
	{
		Sys_Log("net_lib_log", "create tcp socket failed." );
	}
	INIT_CS(&m_lock_send_packet);
}

TCP_Session::~TCP_Session()
{
	m_thread_pool.Cleanup();
	CLOSESOCKET(m_socket);
	m_socket	= INVALID_SOCKET;
	DELETE_CS(&m_lock_send_packet);
}


bool TCP_Session::PushSendPacket(NET_Packet* ptr_packet)
{
	ptr_packet->setSID(m_uid);
	ptr_packet->setUID(m_uid_opposite);
	LOCK_CS(&m_lock_send_packet);
	m_lst_send_packet.push_back(ptr_packet);
	UNLOCK_CS(&m_lock_send_packet);

	return true;
}

NET_Packet*	TCP_Session::PopSendPacket()
{
	NET_Packet* pRet;
	LOCK_CS(&m_lock_send_packet);
	if(m_lst_send_packet.begin()!=m_lst_send_packet.end())
	{
		pRet	= *m_lst_send_packet.begin();
		m_lst_send_packet.pop_front();
	}
	else
		pRet	= NULL;
	UNLOCK_CS(&m_lock_send_packet);

	return pRet;
}


int TCP_Session::recv(NET_Packet* pPacket)
{
	return  pPacket->recv(m_socket);
}

int TCP_Session::send(NET_Packet* pPacket, bool bIC)
{
	if(pPacket==NULL)
		return 0;
	if(bIC)
	{
		this->mark_index(pPacket);
		return  pPacket->send_to(this);
	}
	else
	{
		int ret = pPacket->send_to(this);
		if(pPacket->getIC()==IC_NULL)
		{
			delete(pPacket);
		}
		return ret;
	}
}

bool TCP_Session::RunTransfersThread()
{
	if(false==m_thread_pool.RunThread("recv_thread", thread_TCP_recv, this))
		return false;
	if(false==m_thread_pool.RunThread("send_thread", thread_TCP_send, this))
		return false;
	if(false==m_thread_pool.RunThread("check_connect_thread", thread_check_connect, this))
		return false;

	return true;
}


void TCP_Session::Connect()
{
	if(connect(m_socket,(SOCKADDR *)get_sockaddr_in(),sizeof(m_addr_in))
		==SOCKET_ERROR)
	{
		int err = GETERROR;
		if (err != CONN_INPRROGRESS)
		{
			Sys_Log("net_lib_log", "socket connect error = %d",err); 
			return;
		}
		else
		{
			return;
		}
	}
	RunTransfersThread();
	NET_Session::Connect();
}

⌨️ 快捷键说明

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