?? cconnection.h
字號(hào):
/******************************************************************************
* Copyright (c) 2009 xxx Electronics, Inc.
* All rights reserved.
*-----------------------------------------------------------------------------
* Description:
* CConection class 連接處理
* CError class 錯(cuò)誤處理
* CNetworking class 端口監(jiān)聽以及遠(yuǎn)程計(jì)算機(jī)信息獲取
* CSync class 線程同步處理
* CThreadManager class 線程創(chuàng)建、線程狀態(tài)監(jiān)控、線程釋放
*
* Change History:
* 04/26/2009 Chen Jian 添加注釋、修正線程泄漏問(wèn)題、添加錯(cuò)誤處理
*
* Comments: 支持多個(gè)連接通訊
*
******************************************************************************/
#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:
/*********************************************************************
網(wǎng)絡(luò)連接的管理
*********************************************************************/
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 ();
/*********************************************************************
添加一個(gè)連接到list
@param[in] Connection類指針
*********************************************************************/
void Add ( CConnection* con );
/*********************************************************************
返回第一個(gè)接收到線程的CConnection*并從隊(duì)列中刪除,CConnection類分配空間返回由外部釋放
@return CConnection* if success, else null error code
*********************************************************************/
CConnection* Remove ();
/*********************************************************************
返回指定接收到線程的CConnection*并從隊(duì)列中刪除,CConnection類分配空間返回由外部釋放
@param[in] 索引號(hào)
@return CConnection* if success, else null error code
*********************************************************************/
CConnection* Remove ( int i );
/*********************************************************************
返回指定索引號(hào)連接對(duì)象指針
@param[in] 索引號(hào)
@return CConnection* if success, else null error code
*********************************************************************/
CConnection* Item ( int i );
CConnection* operator [] ( int i );
/*********************************************************************
返回連接數(shù)
@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;
/*連接被接收時(shí)觸發(fā)事件*/
HANDLE m_hAcceptEvent;
/*連接被接收時(shí)觸發(fā)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 ();
/*********************************************************************
監(jiān)聽指定端口
@param[in] int 端口號(hào)
@return BOOL TRUE if success, else error code
*********************************************************************/
bool Listen ( int port );
/*********************************************************************
停止監(jiān)聽
*********************************************************************/
void StopListen ();
/*********************************************************************
返回第一個(gè)接收到線程的CConnection*并從隊(duì)列中刪除,CConnection類分配空間返回由外部釋放
@return CConnection* if success, else NULL error code
*********************************************************************/
CConnection* GetAccepted ();
/*********************************************************************
設(shè)置接收連接時(shí)觸發(fā)的事件
@param[in] HANDLE
*********************************************************************/
void SetAcceptEvent ( HANDLE hEvent );
/*********************************************************************
設(shè)置連接接收時(shí)觸發(fā)的 callbackfun
@param[in] 函數(shù)指針
*********************************************************************/
void SetAcceptFunc ( CALLBACKFUNC hFunc );
/*********************************************************************
返回已接收的連接數(shù)
@return BOOL >=0 if success, else error code
*********************************************************************/
int HasAccepted ();
/*********************************************************************
是否監(jiān)聽
@return BOOL TRUE if Listening
*********************************************************************/
bool IsListening ();
/*********************************************************************
獲取本地計(jì)算機(jī)名
@param[out] 計(jì)算機(jī)名數(shù)組
@param[in] 字符串?dāng)?shù)組大小
@return BOOL TRUE if success, else error code
*********************************************************************/
bool GetLocalName ( char *localname, int len );
/*********************************************************************
取得本地IP地址
@param[out] 計(jì)算機(jī)名數(shù)組
@param[in] 字符串?dāng)?shù)組大小
@return BOOL TRUE if success, else error code
*********************************************************************/
bool GetLocalIP ( char *localip, int len );
/*********************************************************************
獲取本地所有IP地址,多個(gè)IP地址由換行符分割
@param[out] 計(jì)算機(jī)名數(shù)組
@param[in] 字符串?dāng)?shù)組大小
@return BOOL TRUE if success, else error code
*********************************************************************/
bool GetLocalIPs ( char *localips, int len );
/*********************************************************************
通過(guò)查找IP獲得遠(yuǎn)端計(jì)算機(jī)名稱
@param[in] 計(jì)算機(jī)IP數(shù)組
@param[out] 計(jì)算機(jī)名數(shù)組
@param[in] 字符串?dāng)?shù)組大小
@return BOOL TRUE if success, else error code
*********************************************************************/
bool ResolveName ( char *hostip, char *hostname, int len );
/*********************************************************************
通過(guò)查找遠(yuǎn)端計(jì)算機(jī)名獲得IP
@param[in] 計(jì)算機(jī)名數(shù)組
@param[out] 計(jì)算機(jī)IP數(shù)組
@param[in] 字符串?dāng)?shù)組大小
@return BOOL TRUE if success, else error code
*********************************************************************/
bool ResolveIP ( char *hostname, char *hostip, int len );
/*********************************************************************
獲取遠(yuǎn)程所有IP地址,多個(gè)IP地址由換行符分割
@param[in] 日志路徑+日志文件名(擴(kuò)展名由程序追加)
@return BOOL TRUE if success, else error code
*********************************************************************/
bool ResolveIPs ( char *hostname, char *hostips, int len );
/*********************************************************************
獲取所有鏈接到lan的計(jì)算機(jī)名,多個(gè)計(jì)算機(jī)名由換行符分割
@param[out] 計(jì)算機(jī)名數(shù)組
@param[in] 字符串?dāng)?shù)組大小
@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 ();
/*********************************************************************
連接指定計(jì)算機(jī)
@param[in] ip
@param[in] port
@return BOOL TRUE if success, else error code
*********************************************************************/
bool Connect ( const char* host, unsigned short port );
/*********************************************************************
終端連接
*********************************************************************/
void Disconnect ();
/*********************************************************************
獲得連接計(jì)算機(jī)信息
@param[out] 計(jì)算機(jī)IP數(shù)組
@param[in] 字符串大小
@param[out] 遠(yuǎn)程端口
@return BOOL TRUE if success, else error code
*********************************************************************/
bool PeerInfo ( char* host, int host_len, unsigned int* port );
/*********************************************************************
發(fā)送數(shù)據(jù)到連接計(jì)算機(jī)
@param[in] send buffer
@param[in] buffer size
@return int send size
*********************************************************************/
int Send ( const char* buffer, int bufferlen );
/*********************************************************************
接收監(jiān)聽端口第一次獲得的數(shù)據(jù)
@param[out] buffer
@param[in] buffer size
@return BOOL TRUE if success, else error code
*********************************************************************/
int Receive ( char* buffer, int bufferlen );
/*********************************************************************
設(shè)置接收到達(dá)時(shí)觸發(fā)的事件
@param[in] 事件
*********************************************************************/
void SetReceiveEvent ( HANDLE hEvent );
/*********************************************************************
設(shè)置接收到達(dá)時(shí)觸發(fā)的 callbackfun
@param[in] 函數(shù)指針
*********************************************************************/
void SetReceiveFunc ( CALLBACKFUNC hFunc );
/*********************************************************************
設(shè)置關(guān)閉時(shí)處理的事件
@param[in] 事件
*********************************************************************/
void SetCloseEvent ( HANDLE hEvent );
/*********************************************************************
設(shè)置關(guān)閉連接時(shí)觸發(fā)的 callbackfun
@param[in] 函數(shù)指針
@return BOOL TRUE if success, else error code
*********************************************************************/
void SetCloseFunc ( CALLBACKFUNC hFunc );
/*********************************************************************
是否連接
@return BOOL TRUE is Connect
*********************************************************************/
bool IsConnected ();
/*********************************************************************
返回接收到的字節(jié)
@return int > 0 is success, else error code
*********************************************************************/
int HasReceived ();
};
#endif
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -