📄 cconnection.h
字号:
/******************************************************************************
* Copyright (c) 2009 xxx Electronics, Inc.
* All rights reserved.
*-----------------------------------------------------------------------------
* Description:
* CConection class 连接处理
* CError class 错误处理
* CNetworking class 端口监听以及远程计算机信息获取
* CSync class 线程同步处理
* CThreadManager class 线程创建、线程状态监控、线程释放
*
* Change History:
* 04/26/2009 Chen Jian 添加注释、修正线程泄漏问题、添加错误处理
*
* Comments: 支持多个连接通讯
*
******************************************************************************/
#ifndef CCONNECTION_H
#define CCONNECTION_H
#include <winsock.h>
#include <stdio.h>
#include "afx.h"
typedef void ( *CALLBACKFUNC ) ( DWORD ptr );
class CThreadManager
{
public:
protected:
private:
};
class CSync
{
/*CreateMutex Handle*/
HANDLE m_sync;
public:
CSync ();
~CSync ();
CSync ( CSync& s );
CSync& operator= ( CSync& s );
/*********************************************************************
Lock thread
*********************************************************************/
void Lock () const;
/*********************************************************************
UnLock thread
*********************************************************************/
void UnLock () const;
};
class CError
{
CError ( );
friend class CNetworking;
friend class CConnection;
friend class CSync;
public:
static void GetErrorString ( long lCode );
};
class CNetworking
{
public:
/*********************************************************************
网络连接的管理
*********************************************************************/
class CConnectionList
{
class Node
{
public:
CConnection* m_con;
Node* m_next;
Node ();
};
Node* m_first;
Node* m_last;
/*Connection Count*/
int m_length;
public:
CConnectionList ();
~CConnectionList ();
/*********************************************************************
添加一个连接到list
@param[in] Connection类指针
*********************************************************************/
void Add ( CConnection* con );
/*********************************************************************
返回第一个接收到线程的CConnection*并从队列中删除,CConnection类分配空间返回由外部释放
@return CConnection* if success, else null error code
*********************************************************************/
CConnection* Remove ();
/*********************************************************************
返回指定接收到线程的CConnection*并从队列中删除,CConnection类分配空间返回由外部释放
@param[in] 索引号
@return CConnection* if success, else null error code
*********************************************************************/
CConnection* Remove ( int i );
/*********************************************************************
返回指定索引号连接对象指针
@param[in] 索引号
@return CConnection* if success, else null error code
*********************************************************************/
CConnection* Item ( int i );
CConnection* operator [] ( int i );
/*********************************************************************
返回连接数
@return long >=0 if success, else error code
*********************************************************************/
long Length ();
};
private:
static long m_count;
CSync m_sync;
CConnectionList m_accepted;
SOCKET m_socket;
sockaddr_in m_addr;
/*连接被接收时触发事件*/
HANDLE m_hAcceptEvent;
/*连接被接收时触发callback*/
CALLBACKFUNC m_hAcceptFunc;
/*Accept thread handle*/
HANDLE m_hAcceptThread;
/*Thread ID*/
DWORD m_dwAcceptThreadID;
CError m_lasterror;
int AcceptWait ();
static int AcceptThread ( void* pThis );
friend class CConnection;
public:
CNetworking ();
~CNetworking ();
/*********************************************************************
监听指定端口
@param[in] int 端口号
@return BOOL TRUE if success, else error code
*********************************************************************/
bool Listen ( int port );
/*********************************************************************
停止监听
*********************************************************************/
void StopListen ();
/*********************************************************************
返回第一个接收到线程的CConnection*并从队列中删除,CConnection类分配空间返回由外部释放
@return CConnection* if success, else NULL error code
*********************************************************************/
CConnection* GetAccepted ();
/*********************************************************************
设置接收连接时触发的事件
@param[in] HANDLE
*********************************************************************/
void SetAcceptEvent ( HANDLE hEvent );
/*********************************************************************
设置连接接收时触发的 callbackfun
@param[in] 函数指针
*********************************************************************/
void SetAcceptFunc ( CALLBACKFUNC hFunc );
/*********************************************************************
返回已接收的连接数
@return BOOL >=0 if success, else error code
*********************************************************************/
int HasAccepted ();
/*********************************************************************
是否监听
@return BOOL TRUE if Listening
*********************************************************************/
bool IsListening ();
/*********************************************************************
获取本地计算机名
@param[out] 计算机名数组
@param[in] 字符串数组大小
@return BOOL TRUE if success, else error code
*********************************************************************/
bool GetLocalName ( char *localname, int len );
/*********************************************************************
取得本地IP地址
@param[out] 计算机名数组
@param[in] 字符串数组大小
@return BOOL TRUE if success, else error code
*********************************************************************/
bool GetLocalIP ( char *localip, int len );
/*********************************************************************
获取本地所有IP地址,多个IP地址由换行符分割
@param[out] 计算机名数组
@param[in] 字符串数组大小
@return BOOL TRUE if success, else error code
*********************************************************************/
bool GetLocalIPs ( char *localips, int len );
/*********************************************************************
通过查找IP获得远端计算机名称
@param[in] 计算机IP数组
@param[out] 计算机名数组
@param[in] 字符串数组大小
@return BOOL TRUE if success, else error code
*********************************************************************/
bool ResolveName ( char *hostip, char *hostname, int len );
/*********************************************************************
通过查找远端计算机名获得IP
@param[in] 计算机名数组
@param[out] 计算机IP数组
@param[in] 字符串数组大小
@return BOOL TRUE if success, else error code
*********************************************************************/
bool ResolveIP ( char *hostname, char *hostip, int len );
/*********************************************************************
获取远程所有IP地址,多个IP地址由换行符分割
@param[in] 日志路径+日志文件名(扩展名由程序追加)
@return BOOL TRUE if success, else error code
*********************************************************************/
bool ResolveIPs ( char *hostname, char *hostips, int len );
/*********************************************************************
获取所有链接到lan的计算机名,多个计算机名由换行符分割
@param[out] 计算机名数组
@param[in] 字符串数组大小
@return BOOL TRUE if success, else error code
*********************************************************************/
};
class CConnection
{
class CDataStack
{
char* m_buffer;
long m_length;
CSync m_sync;
public:
CDataStack ();
~CDataStack ();
void Append ( const char* data, int len );
int Remove ( char* data, int len );
int Length ();
};
static long m_count;
HANDLE m_event;
CSync m_sync;
CDataStack m_data;
SOCKET m_socket;
sockaddr_in m_addr;
HANDLE m_hRecvEvent;
CALLBACKFUNC m_hRecvFunc;
HANDLE m_hCloseEvent;
CALLBACKFUNC m_hCloseFunc;
HANDLE m_hRecvThread;
DWORD m_dwRecvThreadID;
int RecvWait ();
static int RecvThread ( void* pThis );
friend class CNetworking;
public:
CHistory m_His;
CConnection ();
CConnection ( const char* host, unsigned short port );
~CConnection ();
/*********************************************************************
连接指定计算机
@param[in] ip
@param[in] port
@return BOOL TRUE if success, else error code
*********************************************************************/
bool Connect ( const char* host, unsigned short port );
/*********************************************************************
终端连接
*********************************************************************/
void Disconnect ();
/*********************************************************************
获得连接计算机信息
@param[out] 计算机IP数组
@param[in] 字符串大小
@param[out] 远程端口
@return BOOL TRUE if success, else error code
*********************************************************************/
bool PeerInfo ( char* host, int host_len, unsigned int* port );
/*********************************************************************
发送数据到连接计算机
@param[in] send buffer
@param[in] buffer size
@return int send size
*********************************************************************/
int Send ( const char* buffer, int bufferlen );
/*********************************************************************
接收监听端口第一次获得的数据
@param[out] buffer
@param[in] buffer size
@return BOOL TRUE if success, else error code
*********************************************************************/
int Receive ( char* buffer, int bufferlen );
/*********************************************************************
设置接收到达时触发的事件
@param[in] 事件
*********************************************************************/
void SetReceiveEvent ( HANDLE hEvent );
/*********************************************************************
设置接收到达时触发的 callbackfun
@param[in] 函数指针
*********************************************************************/
void SetReceiveFunc ( CALLBACKFUNC hFunc );
/*********************************************************************
设置关闭时处理的事件
@param[in] 事件
*********************************************************************/
void SetCloseEvent ( HANDLE hEvent );
/*********************************************************************
设置关闭连接时触发的 callbackfun
@param[in] 函数指针
@return BOOL TRUE if success, else error code
*********************************************************************/
void SetCloseFunc ( CALLBACKFUNC hFunc );
/*********************************************************************
是否连接
@return BOOL TRUE is Connect
*********************************************************************/
bool IsConnected ();
/*********************************************************************
返回接收到的字节
@return int > 0 is success, else error code
*********************************************************************/
int HasReceived ();
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -