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 |