blockingsocket.h
上传用户:loctite114
上传日期:2007-01-03
资源大小:49k
文件大小:3k
源码类别:

棋牌游戏

开发平台:

Visual C++

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