SocketStream.h
上传用户:kx_jwh
上传日期:2021-09-03
资源大小:76k
文件大小:2k
源码类别:

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_io_SocketStream_h__
  3. #define __febird_io_SocketStream_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. #include <stdio.h>
  8. #include "../refcount.h"
  9. #include "IStream.h"
  10. #include "IOException.h"
  11. #if defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(WIN64)
  12. # if !defined(_WINSOCK2API_) && !defined(_WINSOCKAPI_)
  13. # include <WinSock2.h>
  14. # endif
  15. #else
  16. typedef int SOCKET;
  17. #endif
  18. namespace febird {
  19. class FEBIRD_DLL_EXPORT SocketException : public IOException
  20. {
  21. public:
  22. explicit SocketException(const char* szMsg = "SocketException");
  23. explicit SocketException(int errCode, const char* szMsg = "SocketException");
  24. static int lastError();
  25. };
  26. class FEBIRD_DLL_EXPORT SocketStream : public RefCounter, public IDuplexStream
  27. {
  28. DECLARE_NONE_COPYABLE_CLASS(SocketStream)
  29. public:
  30. SocketStream(SOCKET socket, bool bAutoClose = true);
  31. ~SocketStream();
  32. public:
  33. size_t read(void* data, size_t length);
  34. size_t write(const void* data, size_t length);
  35. void flush() { }
  36. bool eof() const { return m_bEof; }
  37. size_t tellp() { return posp; }
  38. size_t tellg() { return posg; }
  39. protected:
  40. virtual bool waitfor_again();
  41. ::SOCKET socket;
  42. size_t posp; // sent size/pos
  43. size_t posg; // receive size/pos
  44. bool m_bEof; // for override IInputStream::eof
  45. bool m_bAutoClose;
  46. };
  47. class FEBIRD_DLL_EXPORT SocketAcceptor : public IAcceptor
  48. {
  49. ::SOCKET m_socket;
  50. public:
  51. SocketAcceptor(const char* szBindAddr);
  52. SocketStream* accept();
  53. };
  54. FEBIRD_DLL_EXPORT SocketStream* ConnectSocket(const char* szServerAddr);
  55. }
  56. #endif // __febird_io_SocketStream_h__