📄 iosocketex.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 + -