socketmodel.h
上传用户:swkcbjrc
上传日期:2016-04-02
资源大小:45277k
文件大小:5k
源码类别:

游戏

开发平台:

Visual C++

  1. //SocketModel.h: 
  2. //功能描述:该类是SOCKET通讯综合模型,该类完成后将包装各种SOCKET
  3. //         通讯模式(阻塞select,异步窗口,异步事件,重叠I/O,完成I/O)
  4. //         等.它可以被各种通讯程序方便采用.尤其是基于SERVER/CLIENT
  5. //         的SERVER程序会提高大幅度性能.如果使用人要完成特定的通讯
  6. //         功能可以从该类继承,增加对线程池的支持功能。
  7. #if _MSC_VER > 1000
  8. #pragma once
  9. #endif // _MSC_VER > 1000
  10. #ifdef DLL_EXPORTS
  11. #define DLL_API     __declspec(dllexport)
  12. #else
  13. #define DLL_API     __declspec(dllimport)
  14. #endif
  15. #include <winsock2.h>
  16. //宏
  17. #define Min(a, b)               (((a) < (b)) ? (a): (b))
  18. #define Max(a, b)               (((a) > (b)) ? (a): (b))
  19. #define INext(i, n)             ((((i) + 1) < (n)) ? ((i) + 1): 0)
  20. #define IPrev(i, n)             (((i) > 0) ? ((i) - 1): ((n) - 1))
  21. const int SOCKET_SUCCESS = 0;//与SOCKET_ERROR对应的成功标志
  22. const DWORD _SHUTDOWN_RECV_TIMEOUT = 4*1000;  // 完美关闭时延迟4秒
  23. const DWORD _DEFAULT_TIMEOUT = 120*1000;// 120秒 缺省超时
  24. const int _SOCKET_BUFFER_SIZE = 4096;// 缓冲区缺省大小
  25. const DWORD _CONNECT_TIMEOUT = 120*1000;// 120秒 连接超时
  26. const DWORD _SEND_TIMEOUT = 120*1000;// 120秒 发送超时
  27. const DWORD _RECV_TIMEOUT = 120*1000;// 120秒 接收超时 
  28. const int _EOF = 0x100;// 无效接收字符
  29. const DWORD _BLOCKED_SNDRCV_SLEEP = 100; // 100毫秒(发生阻塞时等待[睡眠]时间)
  30. const int _SOCKET_MAJOR_VERSION  = 2;
  31. const int _SOCKET_MINOR_VERSION = 2;
  32. class DLL_API CSocketModel  
  33. {
  34. public:
  35. //构造函数
  36. CSocketModel();
  37. virtual ~CSocketModel();
  38. private:
  39. int m_nErrorNo;
  40. CRITICAL_SECTION m_csErrorNo;
  41. public:
  42. void CleanupLibrary(void);
  43. int InitLibrary(void);
  44. private:
  45. int SetSocketOption(SOCKET hSocket);
  46. int BlockSocket(SOCKET hSocket, BOOL bBlock);
  47. //发送一次缓冲区数据,不过有可能没有全部发送
  48. int Send_Event(SOCKET hSocket, char const * pszBuffer, 
  49. int nBufferSize, DWORD dwTimeout=_SEND_TIMEOUT);
  50. int SendTo_Event(SOCKET hSocket, const struct sockaddr * pTo,
  51. int nAddrLen,char const * pszBuffer, int nBufferSize, DWORD dwTimeout=_SEND_TIMEOUT);
  52. int Send_Block(SOCKET hSocket,char const * pszBuffer,  int nBufferSize, DWORD dwTimeout=_SEND_TIMEOUT);
  53. int SendTo_Block(SOCKET hSocket, const struct sockaddr * pTo,int nAddrLen,char const * pszBuffer, int nBufferSize, DWORD dwTimeout=_SEND_TIMEOUT);
  54. protected:
  55. //异步
  56. int RecvLL(SOCKET hSocket, char *pszBuffer, int nBufferSize);
  57. int SendLL(SOCKET hSocket, char const * pszBuffer, int nBufferSize);
  58. inline int GetLastError()//获取最近一次操作的错误代码
  59. {return (m_nErrorNo);};
  60. int BindSocket(SOCKET hSocket, struct sockaddr * pSocketAddress, 
  61. int nAddrLen);
  62. int BindSocketEx(SOCKET hSocket,int nPort);
  63. int ListenSocket(SOCKET hSocket, int nConnections);
  64. SOCKET CreateSocket(int nAddressFamily= AF_INET, 
  65. int nType=SOCK_STREAM,int nProtocol= 0);
  66. void CloseSocket(SOCKET hSocket, BOOL bHardClose=FALSE);
  67. DWORD GetIP(const char* name,BOOL bFixNtDNS= FALSE);
  68. //(阻塞模型)
  69. SOCKET Accept_Block(SOCKET hSocket, struct sockaddr * pSocketAddress, int *nAddrLen);
  70. SOCKET Accept_Event(SOCKET hSocket, struct sockaddr * pSocketAddress, int *nAddrLen,DWORD dwTimeout /*= DP_DEFAULT_TIMEOUT*/);
  71. SOCKET AcceptEx_Event(SOCKET hSocket, struct sockaddr * pSocketAddress, int *nAddrLen,HANDLE hEndEvent,DWORD dwTimeout /*= DP_DEFAULT_TIMEOUT*/);
  72. int Connect_Block(SOCKET hSocket, const struct sockaddr * pSocketAddress, int nAddrLen);
  73. //发送全部缓冲区数据,直到超时或发送完毕
  74. int SendData_Block(SOCKET hSocket,char const * pszBuffer, 
  75. int nBufferSize, DWORD dwTimeout=_SEND_TIMEOUT);
  76. //阻塞接收数据,该函数停止是在该端口被关闭(接收长度为0),或出错误的时候
  77. int RecvData_Block(SOCKET hSocket, char *pszBuffer, int nBufferSize, 
  78. DWORD dwTimeout= _RECV_TIMEOUT);
  79. int RecvDataFrom_Block( SOCKET hSocket, struct sockaddr * pFrom,  int nAddrlen,char 
  80. *pszBuffer, int nBufferSize, DWORD dwTimeout=_RECV_TIMEOUT);
  81. //(事件模型)一个线程等待一个事件
  82. int Connect_Event(SOCKET hSocket, const struct sockaddr * pSocketAddress, 
  83. int nAddrLen,DWORD dwTimeout=_CONNECT_TIMEOUT);
  84. int RecvData_Event(SOCKET hSocket, char *pszBuffer, 
  85. int nBufferSize, DWORD dwTimeout= _RECV_TIMEOUT);
  86. int RecvDataFrom_Event( SOCKET hSocket, struct sockaddr * pFrom, 
  87.    int nAddrlen,char *pszBuffer, int nBufferSize,
  88.    DWORD dwTimeout=_RECV_TIMEOUT);
  89. //发送所有数据或超时
  90. int SendData_Event(SOCKET hSocket, char const * pszBuffer, 
  91. int nBufferSize, DWORD dwTimeout=_SEND_TIMEOUT);
  92. inline void SetLastError(int iErrorCode)//设置错误代码
  93. {
  94. ::EnterCriticalSection(&m_csErrorNo);
  95. m_nErrorNo = iErrorCode;
  96. ::LeaveCriticalSection(&m_csErrorNo);
  97. };
  98. };