Socket을 이용한 통신시 type과 buffering, String의 인코딩등등 신경쓸것이 한두가지가 아니다. 이런 작업들을 모두 모아서 관련 Wrapping class를 구성하였다.

 

1. 사용자가 단편 데이타를 읽고 써도 내부적으로 자동 버퍼링 ( 속도향상 )

2. 기본 데이타 타입 지원 ( boolean , integer, string, double, long 등)

3. 기본 바이너리 송수신으로 string변환에 따른 오버헤드감소 ( 속도향상 )

4. Unicode 지원및 자동 변환으로 이종간 스트링 변환에서 해방

5. JAVA 지원으로 이종간 통신편리

6. Transportable Class 지원으로 사용자 정의 Object 송수신

 

class CXSocket : public CXObject
{
public:
    class CTransable{
        friend CXSocket;
    protected:
        virtual unsigned int TR_Length (CXSocket * pSock) = 0;
        virtual unsigned int TR_Read (CXSocket * pSock) = 0;
        virtual unsigned int TR_Write (CXSocket * pSock) = 0;
    };
public:
    enum TYPE{
        TYPE_BOOLEAN = 0,
        TYPE_INTEGER,
        TYPE_STRING,
        TYPE_DOUBLE,
        TYPE_LONG,
        TYPE_OBJECT
    };
public:
    struct BUFFERS{
        int m_remain;
        int m_pos;
        char m_buffer[1024 * 8];
        BUFFERS() : m_remain(0), m_pos(0){}
    } m_buffers[2];
private:
	char m_utf8buf[1024];
public:
	BOOL m_oConnected;
	SOCKET m_sock;
public:
	CXSocket(SOCKET sock = INVALID_SOCKET);
	virtual ~CXSocket(void);
public:
    virtual int AsyncSelect(long timeVal = 500);
    virtual void Close(void);
    virtual bool Connect(LPCTSTR lpszHostAddress, UINT nHostPort);
    virtual bool Connect(const sockaddr* pSockAddr, int sockAddrLen);
public:
	void Attach(SOCKET sock);
protected:
    unsigned int ReadBuffer(void * data, unsigned int len, const bool full = false);
    unsigned int Read(void * data, unsigned int len);
public:
    inline unsigned int Length(bool data) { return 1; };
    inline unsigned int Length(short data) { return sizeof(short); };
    inline unsigned int Length(int data) { return sizeof(int); };
    inline unsigned int Length(double data) { return sizeof(double); };
    inline unsigned int Length(long long data) { return sizeof(long long); };
    inline  unsigned int Length(unsigned int data) { return sizeof(unsigned int); };
    inline unsigned int Length(char * data, unsigned int len) { return len; };
    inline unsigned int Length(char * data) { return strlen(data); };
    unsigned int Length(wchar_t * data, unsigned int len);
    inline unsigned int Length(wchar_t * data) { return Length(data, wcslen(data)); };
    inline unsigned int Length(CString & str) { return Length(str.GetBuffer(0), str.GetLength()); };
    inline unsigned int Length(struct tm & tm) { return sizeof(tm); };
public:
    unsigned int Read(bool * data);
    unsigned int Read(short * data);
    unsigned int Read(int * data);
    unsigned int Read(unsigned int * data);
    unsigned int Read(double * data);
    unsigned int Read(long long * data);
    unsigned int Read(struct tm * data);
    unsigned int Read(char * data, unsigned int * len = NULL);
    unsigned int Read(wchar_t * data, unsigned int * len = NULL);
    unsigned int Read(CString & str);
    unsigned int Read(CTransable & obj);
public:
	TYPE ReadType(void);
protected:
    unsigned int WriteBuffer(const void * data, unsigned int len);
    unsigned int Write(void * data, unsigned int len);
public:
    void WriteBufferFlush(void);
    unsigned int Write(bool data);
    unsigned int Write(short data);
    unsigned int Write(int data);
    unsigned int Write(double data);
    unsigned int Write(long long data);
    unsigned int Write(unsigned int data);
    unsigned int Write(struct tm data);
    unsigned int Write(char * data, unsigned int len);
    unsigned int Write(char * data);
    unsigned int Write(wchar_t * data, unsigned int len);
    unsigned int Write(wchar_t * data);
    unsigned int Write(CString & str);
    unsigned int Write(CTransable & obj);
public:
    unsigned int WriteType(TYPE type);
    void Discard(unsigned int size);
};

 


Custom class 정의밑 사용

class CXMMLogin : CXSocket::CTransable
{
public:
    CString m_loginid;
    CString m_password;
public:
    CXMMLogin() : CXMMPacket(CXMM_CMD_LOGIN){};
    CXMMLogin(HWND sender, LPCTSTR id, LPCTSTR pw)
    : CXMMPacket((LONGLONG)sender, CXMM_CMD_LOGIN), m_loginid(id), m_password(pw) 
    {}
public:
    virtual unsigned int TR_Length(CXSocket * pSock)
    {
        unsigned int len = 0;
        len += pSock->Length(m_loginid);
        len += pSock->Length(m_password);
        return len;
    }

    virtual unsigned int TR_Read(CXSocket * pSock)
    {
        unsigned int len = 0;
        len += pSock->Read(m_loginid);
        len += pSock->Read(m_password);
        return len;
    }

    virtual unsigned int TR_Write(CXSocket * pSock)
    {
        unsigned int len = 0;
        len += pSock->Write(m_loginid);
        len += pSock->Write(m_password);

        return len;
    }
};

 

데이타 타입 그대로 3개의 virtual function 지정후

CXMMLogin login;

socket.Read(login);
socket.Write(login);

으로 데이타 송수신


소켓 통신의 개발속도와 안정성 강화됨

 

* 별도 추가모듈로 HTTP통신 가능 ( 웹어플리케이션과 C/C++ Application간 통신지원)

 

* Full Source를 공개해 볼까 했는데 너무 오래된 놈이라 소스가 없네요. 요즘은 별로 사용할 일이 없는 소스기도 하고~~~

'solution' 카테고리의 다른 글

오토캐드(DXF) 뷰어  (0) 2023.03.22
MS-EXCEL Builder  (0) 2023.03.22

+ Recent posts