sockstream.h
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:9k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. // sockstream.h -*- C++ -*- socket library
  2. // Copyright (C) 1992,1993,1994 Gnanasekaran Swaminathan <gs4t@virginia.edu>
  3. //
  4. // Permission is granted to use at your own risk and distribute this software
  5. // in source and binary forms provided the above copyright notice and this
  6. // paragraph are preserved on all copies.  This software is provided "as is"
  7. // with no express or implied warranty.
  8. //
  9. // Version: 17Oct95 1.10
  10. #ifndef _SOCKSTREAM_H
  11. #define _SOCKSTREAM_H
  12. #ifdef WIN32
  13. typedef int socklen_t;
  14. typedef unsigned long in_addr_t;
  15. #else
  16. #include <sockconfig.h>
  17. #if defined(_linux_) && (! defined(IPPROTO_IP))
  18. typedef uint32_t in_addr_t;
  19. #endif
  20. #endif
  21. // Uses ANSI C++ IOStream classes
  22. #include <iostream>
  23. using namespace std;
  24. #include <stddef.h>
  25. #include <stdio.h>
  26. #ifndef _WIN32
  27. #include <sys/types.h>
  28. #include <sys/uio.h>
  29. #include <sys/socket.h>
  30. #else
  31. #include <winsock.h>
  32. #endif
  33. #include "SWIutilLogger.hpp"
  34. #ifndef _G_config_h
  35. // non libg++ or g++ compilation
  36. #       define _S_NOLIBGXX
  37. #       define _S_USER_BUF 0x0001
  38. #       define _S_UNBUFFERED 0x0002
  39. #       define _S_NO_READS 0x0004
  40. #       define _S_NO_WRITES 0x0008
  41. #       define _S_EOF_SEEN 0x0010
  42. #       define _S_ERR_SEEN 0x0020
  43. #       define _S_DELETE_DONT_CLOSE 0x0040
  44. #       define _S_LINKED 0x0080
  45. #       define _S_LINE_BUF 0x0200
  46. #       define _G_ssize_t size_t
  47. #else
  48. #       ifndef _S_USER_BUF
  49. // libg++ 2.5.x
  50. #               define _S_USER_BUF _IO_USER_BUF
  51. # define _S_UNBUFFERED _IO_UNBUFFERED
  52. # define _S_NO_READS _IO_NO_READS
  53. # define _S_NO_WRITES _IO_NO_WRITES
  54. # define _S_EOF_SEEN _IO_EOF_SEEN
  55. # define _S_ERR_SEEN _IO_ERR_SEEN
  56. # define _S_DELETE_DONT_CLOSE _IO_DELETE_DONT_CLOSE
  57. # define _S_LINKED _IO_LINKED
  58. # define _S_LINE_BUF _IO_LINE_BUF
  59. # endif //  !_S_USER_BUF
  60. #endif //  !_G_config_h
  61. #ifdef __linux__
  62. // linux leaves these things out. We define it for compatitbility
  63. // not for their use.
  64. #ifndef SO_ACCEPTCONN
  65. # define SO_ACCEPTCONN 0x0002
  66. #endif
  67. #ifndef SO_USELOOPBACK
  68. # define SO_USELOOPBACK 0x0040
  69. #endif
  70. #ifndef SO_SNDLOWAT
  71. # define SO_SNDLOWAT 0x1003
  72. # define SO_RCVLOWAT 0x1004
  73. # define SO_SNDTIMEO 0x1005
  74. # define SO_RCVTIMEO 0x1006
  75. #endif
  76. # define MSG_MAXIOVLEN 16
  77. #ifndef SOMAXCONN
  78. # define SOMAXCONN 5
  79. #endif
  80. #endif // __linux__
  81. #define SOCK_ERROR(classname, msg) 
  82.   if (errno) 
  83.     Error(500, L"%s%S%s%S%s%S%s%d", L"class", classname, L"msg", msg, 
  84.   L"errnoStr", strerror(errno), L"errno", errno); 
  85.   else 
  86.     Error(500, L"%s%S%s%S", L"class", classname, L"msg", msg); 
  87. }
  88. typedef int sockexcept;
  89. #if defined(_WIN32) || (defined(__GNUC__) && (__GNUC__ > 2))
  90. #define underflow_ret_t int
  91. #else
  92. #if defined(_decunix_)
  93. #define underflow_ret_t streambuf::int_type
  94. #else
  95. #define underflow_ret_t unsigned int
  96. #endif
  97. #endif
  98. struct sockaddr;
  99. class SWIUTIL_API_CLASS sockAddr : public SWIutilLogger
  100. {
  101.  public:
  102.   sockAddr(const VXIchar *moduleName, VXIlogInterface *pVXILog, 
  103.    VXIunsigned diagTagBase)
  104.     : SWIutilLogger (moduleName, pVXILog, diagTagBase) {}
  105.   virtual ~sockAddr() {}
  106.   virtual operator void* () const =0;
  107.   operator sockaddr* () const { return addr (); }
  108.   virtual socklen_t size  () const =0;
  109.   virtual int family () const =0;
  110.   virtual sockaddr*   addr  () const =0;
  111. };
  112. struct msghdr;
  113. class SWIUTIL_API_CLASS sockbuf: public streambuf, public SWIutilLogger
  114. {
  115.  public:
  116.   enum type {
  117.     sock_stream = SOCK_STREAM,
  118.     sock_dgram = SOCK_DGRAM,
  119.     sock_raw = SOCK_RAW,
  120.     sock_rdm = SOCK_RDM,
  121.     sock_seqpacket  = SOCK_SEQPACKET
  122.   };
  123.   enum option {
  124.     so_debug = SO_DEBUG,
  125.     so_acceptconn = SO_ACCEPTCONN,
  126.     so_reuseaddr = SO_REUSEADDR,
  127.     so_keepalive = SO_KEEPALIVE,
  128.     so_dontroute = SO_DONTROUTE,
  129.     so_broadcast = SO_BROADCAST,
  130.     so_useloopback = SO_USELOOPBACK,
  131.     so_linger = SO_LINGER,
  132.     so_oobinline = SO_OOBINLINE,
  133.     so_sndbuf = SO_SNDBUF,
  134.     so_rcvbuf = SO_RCVBUF,
  135.     so_sndlowat = SO_SNDLOWAT,
  136.     so_rcvlowat = SO_RCVLOWAT,
  137.     so_sndtimeo = SO_SNDTIMEO,
  138.     so_rcvtimeo = SO_RCVTIMEO,
  139.     so_error = SO_ERROR,
  140.     so_type = SO_TYPE
  141.   };
  142.   enum level { sol_socket = SOL_SOCKET };
  143.   enum msgflag {
  144.     msg_oob = MSG_OOB,
  145.     msg_peek = MSG_PEEK,
  146.     msg_dontroute = MSG_DONTROUTE,
  147.     msg_maxiovlen = MSG_MAXIOVLEN
  148.   };
  149.   enum shuthow {
  150.     shut_read,
  151.     shut_write,
  152.     shut_readwrite
  153.   };
  154.   enum { somaxconn = SOMAXCONN };
  155.   struct socklinger {
  156.     int l_onoff; // option on/off
  157.     int l_linger; // linger time
  158.     socklinger (int a, int b): l_onoff (a), l_linger (b) {}
  159.   };
  160. protected:
  161.   struct sockcnt {
  162.     SOCKET sock;
  163.     int cnt;
  164.     sockcnt(SOCKET s, int c): sock(s), cnt(c) {}
  165.   };
  166.   sockcnt* rep;  // counts the # refs to sock
  167.   int stmo; // -1==block, 0==poll, >0 == waiting time in secs
  168.   int rtmo; // -1==block, 0==poll, >0 == waiting time in secs
  169.   virtual underflow_ret_t underflow ();
  170.   virtual sockbuf::int_type  overflow (sockbuf::int_type c = EOF);
  171.   virtual int doallocate ();
  172.   int flush_output ();
  173. #if defined(_WIN32) || (defined(__GNUC__)) || (defined(_decunix_))
  174.   // backward compatible methods from old <streambuf.h> but missing from <streambuf>
  175.   char* base() { return eback(); }
  176.   void    setb(char* b, char* eb, int a =0) { setbuf(b, eb-b); }
  177.   int unbuffered() { return (egptr() <= base()+1) && (epptr() == pbase()); }
  178. #endif
  179. #if defined(_S_NOLIBGXX) || (defined(__GNUC__) && (__GNUC__ > 1))
  180.   int         x_flags; // port to USL iostream
  181.   int                 xflags () const { return x_flags; }
  182.   int                 xsetflags (int f) { return x_flags |= f; }
  183.   int                 xflags (int f)
  184.   { int ret = x_flags; x_flags = f; return ret; }
  185.   void                xput_char (char c) { *pptr() = c; pbump (1); }
  186.   int                 linebuffered () const { return x_flags & _S_LINE_BUF; }
  187. #endif // _S_NOLIBGXX
  188.  public:
  189.   sockbuf (const VXIchar *moduleName, VXIlogInterface *pVXILog, 
  190.    VXIunsigned diagTagBase, SOCKET soc = INVALID_SOCKET);
  191.   sockbuf (const VXIchar *moduleName, VXIlogInterface *pVXILog, 
  192.    VXIunsigned diagTagBase, int domain, type st, int proto=0);
  193.   sockbuf (const sockbuf&);
  194.   sockbuf& operator = (const sockbuf&);
  195.   virtual  ~sockbuf ();
  196.   operator int () const { return rep->sock; }
  197.   virtual sockbuf* open (type, int proto=0);
  198.   virtual sockbuf* close ();
  199.   virtual int sync ();
  200.   virtual _G_ssize_t sys_read (char* buf, _G_ssize_t len);
  201.   virtual _G_ssize_t sys_write (const void* buf, long len);
  202.   virtual int xsputn (const char* s, int n);
  203.   int is_open () const { return rep->sock != INVALID_SOCKET; }
  204.   int is_eof  ()       { return xflags() & _S_EOF_SEEN; }
  205.   virtual int bind (sockAddr&);
  206.   virtual int connect (sockAddr&);
  207.   int listen (int num=somaxconn);
  208.   virtual sockbuf accept ();
  209.   virtual sockbuf accept (sockAddr& sa);
  210.   int read (void* buf, int len);
  211.   int recv (void* buf, int len, int msgf=0);
  212.   int recvfrom(sockAddr& sa,void* buf, int len, int msgf=0);
  213. #if !defined(__linux__) && !defined(_WIN32)
  214.   int recvmsg (msghdr* msg, int msgf=0);
  215.   int sendmsg (msghdr* msg, int msgf=0);
  216. #endif
  217.   int write (const void* buf, int len);
  218.   int send (const void* buf, int len, int msgf=0);
  219.   int sendto (sockAddr& sa,const void* buf, int len, int msgf=0);
  220.   int sendtimeout (int wp=-1);
  221.   int recvtimeout (int wp=-1);
  222.   int is_readready (int wp_sec, int wp_usec=0) const;
  223.   int is_writeready (int wp_sec, int wp_usec=0) const;
  224.   int is_exceptionpending (int wp_sec, int wp_usec=0) const;
  225.   void shutdown (shuthow sh);
  226.   int getopt(option op, void* buf,int len,
  227.        level l=sol_socket) const;
  228.   int           setBlocking(bool blocking);
  229.   void setopt(option op, void* buf,int len,
  230.                        level l=sol_socket) const;
  231.   type gettype () const;
  232.   int clearerror () const;
  233.   int debug   (int opt= -1) const;
  234.   int reuseaddr (int opt= -1) const;
  235.   int keepalive (int opt= -1) const;
  236.   int dontroute (int opt= -1) const;
  237.   int broadcast (int opt= -1) const;
  238.   int oobinline (int opt= -1) const;
  239.   int linger    (int tim= -1) const;
  240.   int sendbufsz (int sz=-1)   const;
  241.   int recvbufsz (int sz=-1)   const;
  242.   void error (const char* errmsg) const;
  243. };
  244. class SWIUTIL_API_CLASS isockstream: public istream
  245. {
  246.  protected:
  247.   isockstream ():
  248.     istream (0)
  249.   {}
  250.  public:
  251.   isockstream(sockbuf* sb):
  252.     istream (sb)
  253.   {}
  254.   virtual ~isockstream ();
  255.   sockbuf* rdbuf () { return static_cast<sockbuf*>(ios::rdbuf());}
  256.   sockbuf* operator -> () { return rdbuf(); }
  257. };
  258. class SWIUTIL_API_CLASS osockstream: public ostream
  259. {
  260.  protected:
  261.   osockstream():
  262.     ostream (0)
  263.   {}
  264.  public:
  265.   osockstream(sockbuf* sb):
  266.     ostream (sb)
  267.   {}
  268.   virtual ~osockstream ();
  269.   sockbuf* rdbuf () { return static_cast<sockbuf*>(ios::rdbuf());}
  270.   sockbuf* operator -> () { return rdbuf(); }
  271. };
  272. class SWIUTIL_API_CLASS iosockstream: public iostream
  273. {
  274.  protected:
  275.   iosockstream ():
  276.     iostream (0)
  277.   {}
  278.  public:
  279.   iosockstream(sockbuf *sb):
  280.     iostream (sb)
  281.   {}
  282.   virtual ~iosockstream ();
  283.   sockbuf* rdbuf () { return static_cast<sockbuf*>(ios::rdbuf());}
  284.   sockbuf* operator -> () { return rdbuf(); }
  285. };
  286. #endif // _SOCKSTREAM_H