⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpclient.cpp

📁 C++ patterns设计模式
💻 CPP
字号:
#include "stdafx.h"
#include "tcpclient.h"

namespace acl
{
	TcpClient::TcpClient()
	{
		m_alive = false;
		m_reconnectInterval = RECONNECT_INTERVAL;
	}

	TcpClient::TcpClient(u_short port, const char *addr)
		: m_comm(SocketAddress(addr, port))
	{		
		m_reconnectInterval = RECONNECT_INTERVAL;		
	}

	TcpClient::~TcpClient()
	{
		stop();
	}

	//start the service
	bool TcpClient::start()
	{	
		if(!m_alive)
		{
			trace(0, "tcp client service started\n");
			bool ret = this->connect();
			startThread();
			m_alive = true;
		}
		return connected();
	}

	bool TcpClient::start(u_short port, const char *addr)
	{	
		if(!m_alive)
		{
			m_comm.setServerAddress(SocketAddress(addr, port));
			return start();
		}
		return connected();
	}

	//stop the service
	void TcpClient::stop(int timeout)
	{
		if(m_alive)
		{
			m_exit_signaled = true;
			m_comm.close();
			waitFinish(timeout);
			stopThread();
			m_alive = false;
		}
	}

	bool TcpClient::connect()
	{
		if(!connected() && m_comm.connect())
		{
			onConnected();
		}
		return m_comm.isConnected();
	}

	bool TcpClient::connect(const SocketAddress &address)
	{
		if(!connected() && m_comm.connect(address))
		{
			onConnected();
		}
		return m_comm.isConnected();
	}
	//main interface for user call :
	int TcpClient::send(const char *buf, int buf_size)
	{
		if(m_comm.isValid() && m_comm.isConnected())
		{
			traceBinary(m_comm, "send buffer :\n", buf, buf_size);
			return m_comm.sendAll(buf, buf_size);
		}
		else
		{
			trace(m_comm, "ERR:socket not ready\n");
			return SOCKET_ERROR;
		}
	}

	// receive procecss
	void TcpClient::threadProcess()
	{
		m_exit_signaled = false;
		int ret;
		timeval tv;
		tv.tv_sec  = 0;
		tv.tv_usec = m_reconnectInterval;
		for(;;)
		{
#ifndef _DEBUG
			try
			{
#endif // _DEBUG
				while(!connected() && !m_exit_signaled)
				{
					Sleep(m_reconnectInterval);
					trace(m_comm, "reconnect...\n");
					connect();
				}
				if(m_exit_signaled)
					break;
				if(m_comm.recvReady(NULL))
				{
					if(m_exit_signaled)
						break;
					//RECV_OK             // recv ok
					//RECV_CLOSE          // connection closed
					//RECV_SOCKET_ERROR   // socket error
					//RECV_USER_ERROR     // user error < 0
					ret = onReceive();
					trace(m_comm, "onReceive return(%d)\n", ret);
					if(ret != RECV_OK)
					{
						handleBroken();
					}
				}
				else
				{
					handleBroken();
				}
#ifndef _DEBUG
			}
			catch(...)
			{
				trace(m_comm, "tcpclient thread catch exception\n");
			}
#endif // _DEBUG
		}
		m_exit_signaled = true;
	}
	void TcpClient::handleBroken()
	{
		m_comm.disconnect();
		onBroken();
	}
}

⌨️ 快捷键说明

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