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

📄 iosocketex.h

📁 五行MMORPG引擎系统V1.0
💻 H
字号:

//SocketModel.h: 
//功能描述:该类是SLSocket通讯综合模型,该类完成后将包装各种SLSocket
//         通讯模式(阻塞select,异步窗口,异步事件,重叠I/O,完成I/O)
//         等.它可以被各种通讯程序方便采用.尤其是基于SERVER/CLIENT
//         的SERVER程序会提高大幅度性能.如果使用人要完成特定的通讯
//         功能可以从该类继承,增加对线程池的支持功能。
#ifndef _SOCKETLAYER_H_
#define _SOCKETLAYER_H_

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

#ifndef _PLATFORM_H_
#include "platform/platform.h"
#endif


struct sockaddr;


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



typedef S32 SLSocket;


namespace CS
{

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

	~IOSocketEx();
private:
	//int m_nErrorNo;
	//CRITICAL_SECTION m_csErrorNo;

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

private:
	int SetSocketOption(SLSocket hSocket);
	int BlockSocket(SLSocket hSocket, bool bBlock);



protected:
	//异步
	int RecvLL(SLSocket hSocket, char *pszBuffer, int nBufferSize);
	int SendLL(SLSocket hSocket, char const * pszBuffer, int nBufferSize);


	/////////////////////////////////////////////////
	//基本Socket操作
	SLSocket CreateSocket(int nAddressFamily, int nType,int nProtocol= 0);
	SLSocket TCPSocket();
	SLSocket UDPSocket();
	void CloseSocket(SLSocket hSocket, bool bHardClose=false);

	int BindSocket(SLSocket hSocket, sockaddr * pSocketAddress, 		int nAddrLen);
	int BindSocketEx(SLSocket hSocket,int nPort);
	int ListenSocket(SLSocket hSocket, int nConnections);

	U32 GetIP(const char* name,bool bFixNtDNS= false);


	/////////////////////////////////////////////////
	//(阻塞模型)
private:
	int Send_Block(SLSocket hSocket,char const * pszBuffer, 	int nBufferSize, U32 dwTimeout=_SEND_TIMEOUT);
	int SendTo_Block(SLSocket hSocket, sockaddr * pTo,int nAddrLen,char const * pszBuffer, int nBufferSize, U32 dwTimeout=_SEND_TIMEOUT);

protected:
	SLSocket Accept_Block(SLSocket hSocket, sockaddr * pSocketAddress,	int *nAddrLen);

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




	/////////////////////////////////////////////////
	//(事件模型)一个线程等待一个事件
private:
	//发送一次缓冲区数据,不过有可能没有全部发送
	int Send_Event(SLSocket hSocket, char const * pszBuffer, 	int nBufferSize, U32 dwTimeout=_SEND_TIMEOUT);
	int SendTo_Event(SLSocket hSocket, sockaddr * pTo,	int nAddrLen,char const * pszBuffer, int nBufferSize, U32 dwTimeout=_SEND_TIMEOUT);

protected:
	int Connect_Event(SLSocket hSocket, sockaddr * pSocketAddress, 	int nAddrLen,U32 dwTimeout=_CONNECT_TIMEOUT);
	int RecvData_Event(SLSocket hSocket, char *pszBuffer, 	int nBufferSize, U32 dwTimeout= _RECV_TIMEOUT);
	int RecvDataFrom_Event( SLSocket hSocket, sockaddr * pFrom, 	   int nAddrlen,char *pszBuffer, int nBufferSize,	   U32 dwTimeout=_RECV_TIMEOUT);
	//发送所有数据或超时
	int SendData_Event(SLSocket hSocket, char const * pszBuffer, 		int nBufferSize, U32 dwTimeout=_SEND_TIMEOUT);



	/////////////////////////////////////////////////
	//获取最近一次操作的错误代码
	inline int GetLastError()	{return 0;}//return (m_nErrorNo);};
	inline void SetLastError(int iErrorCode)//设置错误代码
	{
	//	::EnterCriticalSection(&m_csErrorNo);
	//	m_nErrorNo = iErrorCode;
	//	::LeaveCriticalSection(&m_csErrorNo);
	};	
};


};//namespace RPGServer

#endif //_SOCKETLAYER_H_

⌨️ 快捷键说明

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