blocksock.h
上传用户:shengde
上传日期:2007-02-26
资源大小:117k
文件大小:4k
源码类别:

Ftp服务器

开发平台:

Visual C++

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