bufsocket.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:5k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // BufSocket.h: interface for the CBufSocket class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_BUFSOCKET_H__ABC62098_FF8C_412F_BE5B_820881B1E334__INCLUDED_)
  5. #define AFX_BUFSOCKET_H__ABC62098_FF8C_412F_BE5B_820881B1E334__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. // 包含头文件
  10. #include "winsock2.h"
  11. // 宏定义
  12. #define Min(a, b)               (((a) < (b)) ? (a): (b))
  13. #define INext(i, n)             ((((i) + 1) < (n)) ? ((i) + 1): 0)
  14. #undef IN
  15. #define IN
  16. #undef OUT
  17. #define OUT
  18. // 常量
  19. const int SOCKET_SUCCESS = 0; // SOCKET函数成功返回
  20. const int SOCKET_FAIL = (-1); // SOCKET函数失败
  21. const int SOCKET_BUFFER_TOO_SMALL = 1; // 缓冲区太小
  22. const int INVALID_CHAR = 0x100; // 无效接收字符(正常字符是单字节的)
  23. static const int DEFAULT_BUFFER_SIZE = 4096; // 缺省的缓冲区大小
  24. static const int DEFAULT_SHUTDOWN_RECV_TIMEOUT = 4*1000; // 优雅关闭时延迟4秒
  25. static const int DEFAULT_BLOCKED_SNDRCV_SLEEP = 100; // 100毫秒(发生阻塞时等待[睡眠]时间)
  26. static const int DEFAULT_CONN_TIMEOUT = 20*1000; // 20秒 连接超时
  27. static const int DEFAULT_SEND_TIMEOUT = 20*1000; // 20秒 发送超时
  28. static const int DEFAULT_RECV_TIMEOUT = 20*1000; // 20秒 接收超时 
  29. static const int DEFAULT_ACCEPT_TIMEOUT = 20*1000; // 20秒 等待超时 
  30. #pragma pack(push, 1)
  31. // 数据结构(缓冲区循环使用)
  32. typedef struct _tagBufSocketData
  33. {
  34.     SOCKET hSocket; // SOCKET
  35.     int             nBufferSize; // 数据缓冲大小
  36.     char*           pszBuffer; // 数据缓冲
  37.     int             nBytesInBuffer; // 缓冲区已有数据长度(字节)
  38.     int             nReadIndex; // 可以读取的下一缓冲区位置
  39.     int             nBufferIndex; // 可以使用的下一缓冲区位置
  40. } BSD,*PBSD;
  41. #pragma pack(pop)
  42. class CBufSocket  
  43. {
  44. public:
  45. CBufSocket();
  46. virtual ~CBufSocket();
  47. public:
  48. // 初始化及释放动态链接库
  49. static BOOL InitLibrary( int nMajorVer = 2 ,int nMinorVer = 2 );
  50. static void CleanupLibrary();
  51. static DWORD GetIP(const char* pszName,BOOL bFixNtDNS  = FALSE); // Used to Fix NT DNS Problem
  52. public:
  53. //seawind
  54. HANDLE m_hStopEvent;
  55. int GetLastError(void); // 获取错误
  56. BOOL Create( int nAddressFamily = AF_INET, 
  57. int nType = SOCK_STREAM, 
  58. int nProtocol = 0,
  59. int nBufferSize = DEFAULT_BUFFER_SIZE,
  60. SOCKET hSocket = INVALID_SOCKET,
  61. DWORD dwFlags = WSA_FLAG_OVERLAPPED);
  62. void Close( BOOL bHardClose = FALSE );
  63. int Recv( OUT char *pszBuffer, int nBufferSize, DWORD dwTimeout = DEFAULT_RECV_TIMEOUT);
  64. int Send(char const * pszBuffer, int nBufferSize, DWORD dwTimeout = DEFAULT_SEND_TIMEOUT);
  65. BOOL Connect(char const * pszServer, int nPort,DWORD dwTimeout = DEFAULT_CONN_TIMEOUT,BOOL bFixNtDNS = FALSE);
  66. int BSDGetChar(DWORD dwTimeout = DEFAULT_RECV_TIMEOUT);
  67. int BSDGetString(OUT char *pszBuffer, int nBufferSize,DWORD dwTimeout = DEFAULT_RECV_TIMEOUT);
  68. int BSDGetData(OUT char *pszBuffer, int nBufferSize,DWORD dwTimeout = DEFAULT_RECV_TIMEOUT);
  69. SOCKET GetSocket();
  70. BOOL GetSockName(OUT char *pszIP,OUT int& nPort);
  71. // Add in 1.1 <
  72. BOOL Listen(int nConnections = 5);
  73. BOOL Bind(int nPort = 0);
  74. SOCKET Accept(struct sockaddr * pSocketAddr, int *nAddrLen,DWORD dwTimeout = DEFAULT_ACCEPT_TIMEOUT);
  75. SOCKET Accept(struct sockaddr * pSocketAddr, int *nAddrLen,HANDLE hEndEvent,DWORD dwTimeout = DEFAULT_ACCEPT_TIMEOUT);
  76. // Add in 1.1 >
  77. // Add in 1.2 <
  78. BOOL RecvFrom(OUT char* pszFrom,OUT int& nFromPort,OUT char *pszBuffer,IN int nBufferSize,IN DWORD dwTimeout = DEFAULT_RECV_TIMEOUT);
  79. BOOL SendTo(const char* pszTo,int nToPort,const char * pszBuffer, int nBufferSize, DWORD dwTimeout = DEFAULT_SEND_TIMEOUT);
  80. BOOL SetSockOpt( int nOptionName, const void* lpOptionValue, int nOptionLen, int nLevel = SOL_SOCKET );
  81. BOOL GetSockOpt( int nOptionName, void* lpOptionValue, int* lpOptionLen, int nLevel = SOL_SOCKET );
  82. // Add in 1.2 >
  83. private:
  84. void SetLastError(int nErrorCode);
  85. BOOL SetSocketOption(SOCKET hSocket);
  86. BOOL Connect(SOCKET hSocket, const struct sockaddr * pSocketAddr, int iAddrLen,DWORD dwTimeout);
  87. int     RecvOnce(SOCKET hSocket, OUT char *pszBuffer, int nBufferSize);
  88. int RecvData(SOCKET hSocket, OUT char *pszBuffer, int nBufferSize, DWORD dwTimeout);
  89. int     SendOnce(SOCKET hSocket, char const * pszBuffer, int nBufferSize);
  90. int SendData(SOCKET hSocket, char const * pszBuffer, int nBufferSize, DWORD dwTimeout);
  91. int BSDReadData(PBSD pBSD, DWORD dwTimeout);
  92. // Add in 1.1 <
  93. BOOL Bind(SOCKET hSocket, const struct sockaddr * pSocketAddr, int nAddrLen);
  94. BOOL    Block(SOCKET hSocket, BOOL bBlock);
  95. // Add in 1.1 >
  96. // Add in 1.2 <
  97. int RecvFrom(SOCKET hSocket, struct sockaddr * pFrom, int nFromlen,char *pszBuffer, int nBufferSize, DWORD dwTimeout);
  98. int SendTo(SOCKET hSocket, const struct sockaddr * pTo,int nToLen,char const * pszBuffer, int nBufferSize, DWORD dwTimeout);
  99. // Add in 1.2 >
  100. private:
  101. SOCKET m_hSocket;
  102. PBSD m_pBSD;
  103. int m_nErrorCode; //错误代号
  104. };
  105. #endif // !defined(AFX_BUFSOCKET_H__ABC62098_FF8C_412F_BE5B_820881B1E334__INCLUDED_)