Blocksock.h
上传用户:wpp2016
上传日期:2010-02-01
资源大小:1250k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

Visual C++

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