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

游戏

开发平台:

Visual C++

  1. // blocksock.h
  2. #include "winsock.h"
  3. // needs winsock.h in the precompiled headers
  4. typedef const struct sockaddr* LPCSOCKADDR;
  5. class CBlockingSocketException : public CException
  6. {
  7. DECLARE_DYNAMIC(CBlockingSocketException)
  8. public:
  9. // Constructor
  10. CBlockingSocketException(char* pchMessage);
  11. public:
  12. ~CBlockingSocketException() {}
  13. virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,
  14. PUINT pnHelpContext = NULL);
  15. private:
  16. int m_nError;
  17. CString m_strMessage;
  18. };
  19. extern void LogBlockingSocketException(LPVOID pParam, char* pch, CBlockingSocketException* pe);
  20. class CSockAddr : public sockaddr_in {
  21. public:
  22. // constructors
  23. CSockAddr()
  24. { sin_family = AF_INET;
  25.   sin_port = 0;
  26.   sin_addr.s_addr = 0; } // Default
  27. CSockAddr(const SOCKADDR& sa) { memcpy(this, &sa, sizeof(SOCKADDR)); }
  28. CSockAddr(const SOCKADDR_IN& sin) { memcpy(this, &sin, sizeof(SOCKADDR_IN)); }
  29. CSockAddr(const ULONG ulAddr, const USHORT ushPort = 0) // parms are host byte ordered
  30. { sin_family = AF_INET;
  31.   sin_port = htons(ushPort); //把ushort转换为?
  32.       sin_addr.s_addr = htonl(ulAddr); }
  33. CSockAddr(const char* pchIP, const USHORT ushPort = 0) // dotted IP addr string
  34. { sin_family = AF_INET;
  35.   sin_port = htons(ushPort);
  36.   sin_addr.s_addr = inet_addr(pchIP); } // already network byte ordered
  37. // Return the address in dotted-decimal format
  38. CString DottedDecimal()
  39. { return inet_ntoa(sin_addr); } // constructs a new CString object
  40. // Get port and address (even though they're public)
  41. USHORT Port() const
  42. { return ntohs(sin_port); }
  43. ULONG IPAddr() const
  44. { return ntohl(sin_addr.s_addr); }
  45. // operators added for efficiency
  46. const CSockAddr& operator=(const SOCKADDR& sa)
  47. { memcpy(this, &sa, sizeof(SOCKADDR));
  48.   return *this; }
  49. const CSockAddr& operator=(const SOCKADDR_IN& sin)
  50. { memcpy(this, &sin, sizeof(SOCKADDR_IN));
  51.   return *this; }
  52. operator SOCKADDR()
  53. { return *((LPSOCKADDR) this); }
  54. operator LPSOCKADDR()
  55. { return (LPSOCKADDR) this; }
  56. operator LPSOCKADDR_IN()
  57. { return (LPSOCKADDR_IN) this; }
  58. };
  59. // member functions truly block and must not be used in UI threads
  60. // use this class as an alternative to the MFC CSocket class
  61. class CBlockingSocket : public CObject
  62. {
  63. DECLARE_DYNAMIC(CBlockingSocket)
  64. public:
  65. SOCKET m_hSocket;
  66. CBlockingSocket() { m_hSocket = NULL; }
  67. void Cleanup();
  68. void Create(int nType = SOCK_STREAM);
  69. void Close();
  70. void Bind(LPCSOCKADDR psa);
  71. void Listen();
  72. void Connect(LPCSOCKADDR psa);
  73. BOOL Accept(CBlockingSocket& s, LPSOCKADDR psa);
  74. int Send(const char* pch, const int nSize, const int nSecs);
  75. int Write(const char* pch, const int nSize, const int nSecs);
  76. int Receive(char* pch, const int nSize, const int nSecs);
  77. int SendDatagram(const char* pch, const int nSize, LPCSOCKADDR psa, 
  78. const int nSecs);
  79. int ReceiveDatagram(char* pch, const int nSize, LPSOCKADDR psa, 
  80. const int nSecs);
  81. void GetPeerAddr(LPSOCKADDR psa);
  82. void GetSockAddr(LPSOCKADDR psa);
  83. static CSockAddr GetHostByName(const char* pchName, 
  84. const USHORT ushPort = 0);
  85. static const char* GetHostByAddr(LPCSOCKADDR psa);
  86. operator SOCKET()
  87. { return m_hSocket; }
  88. };
  89. class CHttpBlockingSocket : public CBlockingSocket
  90. {
  91. public:
  92. DECLARE_DYNAMIC(CHttpBlockingSocket)
  93. enum {nSizeRecv = 1000}; // max receive buffer size (> hdr line length)
  94. CHttpBlockingSocket();
  95. ~CHttpBlockingSocket();
  96. int ReadHttpHeaderLine(char* pch, const int nSize, const int nSecs);
  97. int ReadHttpResponse(char* pch, const int nSize, const int nSecs);
  98. private:
  99. char* m_pReadBuf; // read buffer
  100. int m_nReadBuf; // number of bytes in the read buffer
  101. };