📄 tcpsocketserver.h
字号:
#ifndef _TCPSOCKETSERVER_H_
#define _TCPSOCKETSERVER_H_
#include <winsock2.h>
#include <hash_map>
#include <iostream>
#include <process.h>
#include "sync.h"
#include "Socket.h"
using namespace std;
using namespace stdext;
#define WIOCP_ENDWAIT 20000
typedef enum {
RECV_POSTED,
SEND_POSTED,
STOP_POSTED
} IO_OPERATION_TYPE;
struct PER_IO_OPERATION_DATA:OVERLAPPED{
WSABUF DataBuf;
char Buffer[MAX_UDP_PACKAGE_SIZE+8];
IO_OPERATION_TYPE OperationType;
};
struct PER_SOCKET_DATA{
SOCKET socket;
volatile long io_count;
};
class TCPSocketServer
{
public:
TCPSocketServer(void);
~TCPSocketServer(void);
bool init();
bool start(unsigned short usPort,unsigned long ulIP);
private:
bool StartThread();
static unsigned int __stdcall ThreadProc(void* lpParam);
void ClearSocket(SOCKET s, DWORD dwParam);
void ThreadCleanUp();
bool Stop();
private:
list<PER_SOCKET_DATA*> m_socks;//这是一个冗余的类,用于删除第一个元素,把没用的socket接到最后
HANDLE m_hIOCP;//io completion port handle
ULONG m_NumThreads;// number of threads currently created
ULONG m_ConcurrentThreads;// number of threads to run simultaniously
ULONG m_RunningThreads;// number of threads running, doing something useful
ULONG m_MaxThreads;// maximum number of threads allowed to be in the iocp
hash_map<DWORD, DWORD> m_ThreadMap;
CriticalSection m_ThreadMapLock;
// CriticalSection m_ClearSocketLock;
SOCKET m_FirstSocket;
HANDLE m_hStopEvent;
protected:
bool stop;
public:
int Send(char* pData, size_t nLen, SOCKET s, DWORD dwParam = 0);
int Connect(unsigned short usPort,unsigned long ulIP,SOCKET& addr_a,DWORD& addr_b);
virtual int OnReceive(char* pData, size_t nLen, SOCKET s,DWORD dwParam) = 0;
// virtual int OnConnect(SOCKET s,DWORD dwParam) = 0;
virtual int OnClosed(SOCKET s,DWORD dwParam) = 0;
virtual int OnAccepted(SOCKET s,DWORD dwParam) = 0;
virtual int OnSend(SOCKET s,DWORD dwParam) = 0;
void SetStop(){closesocket(m_FirstSocket);stop = false;};
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -