⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketmodel.h

📁 <VC++网络游戏建摸与实现>源代码
💻 H
字号:
//SocketModel.h: 
//功能描述:该类是SOCKET通讯综合模型,该类完成后将包装各种SOCKET
//         通讯模式(阻塞select,异步窗口,异步事件,重叠I/O,完成I/O)
//         等.它可以被各种通讯程序方便采用.尤其是基于SERVER/CLIENT
//         的SERVER程序会提高大幅度性能.如果使用人要完成特定的通讯
//         功能可以从该类继承,增加对线程池的支持功能。

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <winsock2.h>

//宏
#define Min(a, b)               (((a) < (b)) ? (a): (b))
#define Max(a, b)               (((a) > (b)) ? (a): (b))
#define INext(i, n)             ((((i) + 1) < (n)) ? ((i) + 1): 0)
#define IPrev(i, n)             (((i) > 0) ? ((i) - 1): ((n) - 1))

const int SOCKET_SUCCESS = 0;//与SOCKET_ERROR对应的成功标志
const DWORD	_SHUTDOWN_RECV_TIMEOUT = 4*1000;  // 完美关闭时延迟4秒
const DWORD _DEFAULT_TIMEOUT = 120*1000;// 120秒 缺省超时
const int _SOCKET_BUFFER_SIZE	= 4096;// 缓冲区缺省大小
const DWORD _CONNECT_TIMEOUT	= 120*1000;// 120秒 连接超时
const DWORD _SEND_TIMEOUT		= 120*1000;// 120秒 发送超时
const DWORD _RECV_TIMEOUT		= 120*1000;// 120秒 接收超时 
const int _EOF						= 0x100;// 无效接收字符
const DWORD _BLOCKED_SNDRCV_SLEEP	= 100; // 100毫秒(发生阻塞时等待[睡眠]时间)
const int _SOCKET_MAJOR_VERSION 	= 2;
const int _SOCKET_MINOR_VERSION	= 2;

class CSocketModel  
{
public:
//构造函数
	CSocketModel();

	virtual ~CSocketModel();
private:
	int m_nErrorNo;
	CRITICAL_SECTION m_csErrorNo;

public:
	void CleanupLibrary(void);
	int InitLibrary(void);

private:
	int SetSocketOption(SOCKET hSocket);
	int BlockSocket(SOCKET hSocket, BOOL bBlock);
	//发送一次缓冲区数据,不过有可能没有全部发送
	int Send_Event(SOCKET hSocket, char const * pszBuffer, 
	int nBufferSize, DWORD dwTimeout=_SEND_TIMEOUT);
	int SendTo_Event(SOCKET hSocket, const struct sockaddr * pTo,
	int nAddrLen,char const * pszBuffer, int nBufferSize, DWORD 
dwTimeout=_SEND_TIMEOUT);
	int Send_Block(SOCKET hSocket,char const * pszBuffer, 	int nBufferSize, DWORD 
dwTimeout=_SEND_TIMEOUT);

	int SendTo_Block(SOCKET hSocket, const struct sockaddr * pTo,int nAddrLen,char const * 
pszBuffer, int nBufferSize, DWORD dwTimeout=_SEND_TIMEOUT);
protected:
	//异步
	int RecvLL(SOCKET hSocket, char *pszBuffer, int nBufferSize);
	int SendLL(SOCKET hSocket, char const * pszBuffer, int nBufferSize);

	inline int GetLastError()//获取最近一次操作的错误代码
	{return (m_nErrorNo);};
	int BindSocket(SOCKET hSocket, struct sockaddr * pSocketAddress, 
		int nAddrLen);
	int BindSocketEx(SOCKET hSocket,int nPort);
	int ListenSocket(SOCKET hSocket, int nConnections);
	SOCKET CreateSocket(int nAddressFamily= AF_INET, 
		int nType=SOCK_STREAM,int nProtocol= 0);
	void CloseSocket(SOCKET hSocket, BOOL bHardClose=FALSE);
	DWORD GetIP(const char* name,BOOL bFixNtDNS= FALSE);

	//(阻塞模型)
	SOCKET Accept_Block(SOCKET hSocket, struct sockaddr * pSocketAddress,	int 
*nAddrLen);
	int Connect_Block(SOCKET hSocket, const struct sockaddr * pSocketAddress, 
		int nAddrLen);
	//发送全部缓冲区数据,直到超时或发送完毕
	int SendData_Block(SOCKET hSocket,char const * pszBuffer, 
		int nBufferSize, DWORD dwTimeout=_SEND_TIMEOUT);
	//阻塞接收数据,该函数停止是在该端口被关闭(接收长度为0),或出错误的时候
	int RecvData_Block(SOCKET hSocket, char *pszBuffer, int nBufferSize, 
		DWORD dwTimeout= _RECV_TIMEOUT);
	int RecvDataFrom_Block( SOCKET hSocket, struct sockaddr * pFrom,  int nAddrlen,char 
*pszBuffer, int nBufferSize, DWORD dwTimeout=_RECV_TIMEOUT);

	//(事件模型)一个线程等待一个事件
	int Connect_Event(SOCKET hSocket, const struct sockaddr * pSocketAddress, 
		int nAddrLen,DWORD dwTimeout=_CONNECT_TIMEOUT);

	int RecvData_Event(SOCKET hSocket, char *pszBuffer, 
		int nBufferSize, DWORD dwTimeout= _RECV_TIMEOUT);

	int RecvDataFrom_Event( SOCKET hSocket, struct sockaddr * pFrom, 
	   int nAddrlen,char *pszBuffer, int nBufferSize,
	   DWORD dwTimeout=_RECV_TIMEOUT);
	//发送所有数据或超时
	int SendData_Event(SOCKET hSocket, char const * pszBuffer, 
		int nBufferSize, DWORD dwTimeout=_SEND_TIMEOUT);
	inline void SetLastError(int iErrorCode)//设置错误代码
	{
		::EnterCriticalSection(&m_csErrorNo);
		m_nErrorNo = iErrorCode;
		::LeaveCriticalSection(&m_csErrorNo);
	};	
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -