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

📄 cconnection.h

📁 wince 下网络通讯类
💻 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 + -