tcpsocket.h
字号:
#pragma once
#ifndef interface
#define interface class
#endif
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#define DESTROY_OBJ( p ) \
if( NULL != p ){ \
delete p; \
p = NULL; }
#define THREAD_MAXNUM 4 //线程数目最大值
const int DATA_BUFSIZE = 8192*2;
typedef struct TagLPWSAOVERLAPPEDEX
{
WSAOVERLAPPED Overlapped; //重叠结构
WSABUF WSABuf;//socket数据缓冲
char Buffer[DATA_BUFSIZE];//wsaBuf指向的真实数据位置
SOCKET hSocket;//socket 句柄
LPVOID pTSS;
TagLPWSAOVERLAPPEDEX *pPair;//指向相关socket的重叠扩展结构
}WSAOVERLAPPEDEX, *LPWSAOVERLAPPEDEX;//重叠扩展结构
interface ITcpSocketLower
{
virtual int WINAPI SendData(char *pData,int len,int socketId) = 0;
};
interface ITcpSocketUpper
{
virtual void WINAPI OnRecvData(char *pData,int len,sockaddr_in destaddr,int socketId) = 0;
virtual void WINAPI OnClose(int socketId,sockaddr_in destaddr) = 0;
virtual void WINAPI OnConnect(sockaddr_in destaddr,int socketId) = 0;
};
class CTcpSvrSocket:public ITcpSocketLower
{
public:
CTcpSvrSocket(int nListenPort,ITcpSocketUpper *pTSU = NULL);
~CTcpSvrSocket(void);
//Lower Interface
virtual int WINAPI SendData(char *pData,int len,int socketId);
void Start();
void Stop();
enum{
RUNNIG,
STOP
}STATE;
protected:
ITcpSocketUpper *m_pTSU;
int m_nListenPort;
char m_Addr[17];
HANDLE m_hThread;
HANDLE m_hCompletionPort;
int m_nThreadState;
static DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID);
static DWORD WINAPI MainThread(LPVOID pArgu);
void SafeClose(LPWSAOVERLAPPEDEX lpOvlpEx);
};
class CTcpCltSocket:public ITcpSocketLower
{
public:
CTcpCltSocket(int nListenPort,ITcpSocketUpper *pTSU = NULL);
~CTcpCltSocket(void);
//Lower Interface
virtual int WINAPI SendData(char *pData,int len,int socketId);
bool Start(const char * ip, unsigned short port );
void Stop();
enum{
RUNNIG,
STOP
}STATE;
protected:
ITcpSocketUpper *m_pTSU;
int m_nListenPort;
char m_Addr[17];
HANDLE m_hThread;
HANDLE m_hCompletionPort;
int m_nThreadState;
SOCKET m_socket;
static DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID);
void SafeClose(LPWSAOVERLAPPEDEX lpOvlpEx);
};
class CTcpSocketCtl:public ITcpSocketUpper
{
public:
CTcpSocketCtl( CWnd *pWnd = NULL,int nListenPort = 0,const char *pAdd = NULL) {
m_pWnd = pWnd;
m_pTcpSvrSocket = new CTcpSvrSocket(nListenPort);
};
~CTcpSocketCtl() {
DESTROY_OBJ( m_pTcpSvrSocket );
};
//Lower
//virtual int WINAPI SendData(char *pData,int len,int socketId);
//Upper
virtual void WINAPI OnRecvData(char *pData,int len,sockaddr_in destaddr,int socketId);
virtual void WINAPI OnClose(int socketId,sockaddr_in destaddr);
private:
CTcpSvrSocket *m_pTcpSvrSocket;
CTcpCltSocket *m_pTcpCltSocket;
CWnd *m_pWnd;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -