123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- #include "stdafx.h"
- #include <afxtempl.h>
- #include <winsock2.h>
- #include <Mswsock.h>
- #include <list>
- #include <vector>
- #include <string>
- #include <process.h>
- #include <time.h>
- #include <map>
- #include "iostream"
- using namespace std;
- #define SOCKET_BUF_SIZE 10240
- #define OVERLAPPED_DELIVER_SEND 0
- #define OVERLAPPED_DELIVER_RECV 2
- class MyTcpSrv;
- typedef struct _CLIENT_ELEMENT
- {
- SOCKET s_socket;
- SOCKADDR_IN s_clientInfo;
- time_t s_tVisitTM;
- bool s_bFirstFrame;
- _CLIENT_ELEMENT()
- {
- s_socket = INVALID_SOCKET;
- }
- } TS_CLIENT_ELEMENT, * LPTS_CLIENT_ELEMENT;
- typedef struct _SOCKET_INFORMATION
- {
- OVERLAPPED s_overlapped;
- CHAR s_buffer[SOCKET_BUF_SIZE];
- int s_nBufLen;
- WSABUF s_dataBuf;
- LPTS_CLIENT_ELEMENT s_lpClientElement;
- UINT s_uDeliverType;
- int s_uAntiSendSize;
- bool s_bIsDiscard;
- MyTcpSrv* s_pThis;
- _SOCKET_INFORMATION()
- {
- s_lpClientElement = NULL;
- s_pThis = NULL;
- }
- } SOCKET_INFORMATION, * LPSOCKET_INFORMATION;
- typedef struct _netPara
- {
- UCHAR s_szBuf[SOCKET_BUF_SIZE];
- WORD s_wBufLen;
-
- void Append(_netPara* pNet)
- {
- memcpy(s_szBuf + s_wBufLen,pNet->s_szBuf,min(SOCKET_BUF_SIZE - s_wBufLen, pNet->s_wBufLen));
- s_wBufLen += pNet->s_wBufLen;
- }
-
- void Release(UINT uSize)
- {
- UCHAR szBuf[SOCKET_BUF_SIZE];
- memcpy(szBuf, s_szBuf + uSize, s_wBufLen - uSize);
- memset(s_szBuf, 0, SOCKET_BUF_SIZE);
- memcpy(s_szBuf, szBuf, s_wBufLen - uSize);
- s_wBufLen = s_wBufLen - uSize;
- }
- }SNetPara, * LPNetPara;
- typedef struct _terminal_info
- {
- string s_ip;
- USHORT s_uPort;
-
- friend inline bool operator < (const _terminal_info &ls, const _terminal_info &rs);
- friend inline bool operator == (const _terminal_info &ls, const _terminal_info &rs);
- }TERMINAL_INFO, * LPTERMINAL_INFO;
- bool operator < (const _terminal_info& ls, const _terminal_info& rs)
- {
- return (ls.s_ip < rs.s_ip || (ls.s_ip == rs.s_ip && ls.s_uPort < rs.s_uPort));
- }
- bool operator == (const _terminal_info& ls, const _terminal_info& rs)
- {
- return (ls.s_ip == rs.s_ip && ls.s_uPort == rs.s_uPort);
- }
- typedef vector<TS_CLIENT_ELEMENT> VClnt;
- typedef list<SNetPara> LNetPara;
- typedef map<TERMINAL_INFO, SNetPara> MNetDatagram;
- class MyTcpSrv
- {
- private:
- CRITICAL_SECTION m_csLock;
- HANDLE m_hIOCP;
- SOCKADDR_IN m_LocalAddr;
- SOCKET m_sLinstenSocket;
- HANDLE m_hListenThread;
- UINT m_nListenThreadId;
- HANDLE m_hListenEventExit;
- SYSTEM_INFO m_sysInfo;
- VClnt m_clntList;
- MNetDatagram m_netParaMap;
- public:
- MyTcpSrv()
- {
- InitializeCriticalSection(&m_csLock);
- m_hIOCP = INVALID_HANDLE_VALUE;
- m_sLinstenSocket = INVALID_SOCKET;
- m_hListenThread = INVALID_HANDLE_VALUE;
- m_hListenEventExit = INVALID_HANDLE_VALUE;
- }
- ~MyTcpSrv()
- {
- DeleteCriticalSection(&m_csLock);
- }
- private:
-
- bool LoadSock();
-
- bool SetLocalAddr(WORD nPort, const char *szAddr);
-
- bool InitialIOCP();
-
- bool SetupListenSocket();
-
- void DeliverRecv(LPSOCKET_INFORMATION lpInfo);
-
- void DeliverSend(LPSOCKET_INFORMATION lpInfo);
-
- bool RunListenThread();
-
- UINT static WINAPI TCPListenThreadProc(LPVOID pParam);
-
- UINT static WINAPI ServerWorkerThread(LPVOID CompletionPortID);
-
- void Erase(LPSOCKET_INFORMATION lpSocketInfo);
-
- void OnRecvData(LPSOCKET_INFORMATION lpSocketInfo);
-
- void StopListening();
-
- void DisconnectUser(SOCKADDR_IN clientAddr);
-
- void DisconnectAllUsers();
-
- void UnloadSock();
- public:
-
- bool Create(LPTERMINAL_INFO pInfo);
-
- void Close();
-
-
- int Read(byte byRecv[], UINT uMaxSize, LPTERMINAL_INFO pInfo);
-
- int Write(byte bySend[], UINT uAntiSize, LPTERMINAL_INFO pInfo);
-
- bool Reset();
-
- VClnt GetClinetList()
- {
- return m_clntList;
- }
- };
|