⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sockstream.h

📁 OSB-PIK-OpenVXI-3.0.0源代码 “中国XML论坛 - 专业的XML技术讨论区--XML在语音技术中的应用”
💻 H
字号:
// sockstream.h -*- C++ -*- socket library// Copyright (C) 1992,1993,1994 Gnanasekaran Swaminathan <gs4t@virginia.edu>//// Permission is granted to use at your own risk and distribute this software// in source and binary forms provided the above copyright notice and this// paragraph are preserved on all copies.  This software is provided "as is"// with no express or implied warranty.//// Version: 17Oct95 1.10#ifndef _SOCKSTREAM_H#define	_SOCKSTREAM_H#ifdef WIN32typedef int socklen_t;typedef unsigned long in_addr_t;#else#include <sockconfig.h>#if defined(_linux_) && (! defined(IPPROTO_IP))typedef uint32_t in_addr_t;#endif#endif// Uses ANSI C++ IOStream classes#include <iostream>using namespace std;#include <stddef.h>#include <stdio.h>#ifndef _WIN32#include <sys/types.h>#include <sys/uio.h>#include <sys/socket.h>#else#include <winsock.h>#endif#include "SWIutilLogger.hpp"#ifndef _G_config_h// non libg++ or g++ compilation#       define _S_NOLIBGXX#       define _S_USER_BUF		0x0001#       define _S_UNBUFFERED		0x0002#       define _S_NO_READS		0x0004#       define _S_NO_WRITES		0x0008#       define _S_EOF_SEEN		0x0010#       define _S_ERR_SEEN		0x0020#       define _S_DELETE_DONT_CLOSE	0x0040#       define _S_LINKED		0x0080#       define _S_LINE_BUF		0x0200#       define _G_ssize_t size_t#else#       ifndef _S_USER_BUF		// libg++ 2.5.x#               define _S_USER_BUF		_IO_USER_BUF#		define _S_UNBUFFERED		_IO_UNBUFFERED#		define _S_NO_READS		_IO_NO_READS#		define _S_NO_WRITES		_IO_NO_WRITES#		define _S_EOF_SEEN		_IO_EOF_SEEN#		define _S_ERR_SEEN		_IO_ERR_SEEN#		define _S_DELETE_DONT_CLOSE	_IO_DELETE_DONT_CLOSE#		define _S_LINKED		_IO_LINKED#		define _S_LINE_BUF		_IO_LINE_BUF#	endif //  !_S_USER_BUF#endif //  !_G_config_h#ifdef __linux__// linux leaves these things out. We define it for compatitbility// not for their use.#ifndef SO_ACCEPTCONN#	define SO_ACCEPTCONN	0x0002#endif#ifndef SO_USELOOPBACK#	define SO_USELOOPBACK	0x0040#endif#ifndef SO_SNDLOWAT#	define SO_SNDLOWAT	0x1003#	define SO_RCVLOWAT	0x1004#	define SO_SNDTIMEO	0x1005#	define SO_RCVTIMEO	0x1006#endif#	define MSG_MAXIOVLEN	16#ifndef SOMAXCONN#	define SOMAXCONN	5#endif#endif // __linux__#define SOCK_ERROR(classname, msg) \{ \  if (errno) \    Error(500, L"%s%S%s%S%s%S%s%d", L"class", classname, L"msg", msg, \	  L"errnoStr", strerror(errno), L"errno", errno); \  else \    Error(500, L"%s%S%s%S", L"class", classname, L"msg", msg); \}typedef int sockexcept;#if defined(_WIN32) || (defined(__GNUC__) && (__GNUC__ > 2))#define underflow_ret_t int#else#if defined(_decunix_)#define underflow_ret_t streambuf::int_type#else#define underflow_ret_t unsigned int#endif#endifstruct sockaddr;class SWIUTIL_API_CLASS sockAddr : public SWIutilLogger{ public:  sockAddr(const VXIchar *moduleName, VXIlogInterface *pVXILog, 	   VXIunsigned diagTagBase)    : SWIutilLogger (moduleName, pVXILog, diagTagBase) {}  virtual ~sockAddr() {}  virtual operator void*	() const =0;  operator sockaddr* () const { return addr (); }  virtual socklen_t	size 		() const =0;  virtual int		family		() const =0;  virtual sockaddr*   addr 		() const =0;};struct msghdr;class SWIUTIL_API_CLASS sockbuf: public streambuf, public SWIutilLogger{ public:  enum type {    sock_stream	= SOCK_STREAM,    sock_dgram	= SOCK_DGRAM,    sock_raw	= SOCK_RAW,    sock_rdm	= SOCK_RDM,    sock_seqpacket  = SOCK_SEQPACKET  };  enum option {    so_debug	= SO_DEBUG,    so_acceptconn	= SO_ACCEPTCONN,    so_reuseaddr	= SO_REUSEADDR,    so_keepalive	= SO_KEEPALIVE,    so_dontroute	= SO_DONTROUTE,    so_broadcast	= SO_BROADCAST,    so_useloopback	= SO_USELOOPBACK,    so_linger	= SO_LINGER,    so_oobinline	= SO_OOBINLINE,    so_sndbuf	= SO_SNDBUF,    so_rcvbuf	= SO_RCVBUF,    so_sndlowat	= SO_SNDLOWAT,    so_rcvlowat	= SO_RCVLOWAT,    so_sndtimeo	= SO_SNDTIMEO,    so_rcvtimeo	= SO_RCVTIMEO,    so_error	= SO_ERROR,    so_type		= SO_TYPE  };  enum level { sol_socket = SOL_SOCKET };  enum msgflag {    msg_oob		= MSG_OOB,    msg_peek	= MSG_PEEK,    msg_dontroute	= MSG_DONTROUTE,    msg_maxiovlen	= MSG_MAXIOVLEN  };  enum shuthow {    shut_read,    shut_write,    shut_readwrite  };  enum { somaxconn	= SOMAXCONN };  struct socklinger {    int	l_onoff;	// option on/off    int	l_linger;	// linger time    socklinger (int a, int b): l_onoff (a), l_linger (b) {}  };protected:  struct sockcnt {    SOCKET sock;    int	cnt;    sockcnt(SOCKET s, int c): sock(s), cnt(c) {}  };  sockcnt*	rep;  // counts the # refs to sock  int		stmo; // -1==block, 0==poll, >0 == waiting time in secs  int		rtmo; // -1==block, 0==poll, >0 == waiting time in secs  virtual underflow_ret_t underflow ();  virtual sockbuf::int_type  overflow (sockbuf::int_type c = EOF);  virtual int		doallocate ();  int			flush_output ();#if defined(_WIN32) || (defined(__GNUC__)) || (defined(_decunix_))  // backward compatible methods from old <streambuf.h> but missing from <streambuf>  char*	base() { return eback(); }  void    setb(char* b, char* eb, int a =0) { setbuf(b, eb-b); }  int unbuffered() { return (egptr() <= base()+1) && (epptr() == pbase()); }#endif#if defined(_S_NOLIBGXX) || (defined(__GNUC__) && (__GNUC__ > 1))  int         x_flags; // port to USL iostream  int                 xflags () const { return x_flags; }  int                 xsetflags (int f) { return x_flags |= f; }  int                 xflags (int f)  { int ret = x_flags; x_flags = f; return ret; }  void                xput_char (char c) { *pptr() = c; pbump (1); }  int                 linebuffered () const { return x_flags & _S_LINE_BUF; }#endif // _S_NOLIBGXX public:  sockbuf (const VXIchar *moduleName, VXIlogInterface *pVXILog, 	   VXIunsigned diagTagBase, SOCKET soc = INVALID_SOCKET);  sockbuf (const VXIchar *moduleName, VXIlogInterface *pVXILog, 	   VXIunsigned diagTagBase, int domain, type st, int proto=0);  sockbuf (const sockbuf&);  sockbuf&		operator = (const sockbuf&);  virtual 		~sockbuf ();  operator int () const { return rep->sock; }  virtual sockbuf*	open	(type, int proto=0);  virtual sockbuf*	close	();  virtual int		sync	();  virtual _G_ssize_t	sys_read (char* buf, _G_ssize_t len);  virtual _G_ssize_t	sys_write (const void* buf, long len);  virtual int		xsputn (const char* s, int n);  int			is_open () const { return rep->sock != INVALID_SOCKET; }  int			is_eof  ()       { return xflags() & _S_EOF_SEEN; }  virtual int		bind	(sockAddr&);  virtual int		connect	(sockAddr&);  int		listen	(int num=somaxconn);  virtual sockbuf	accept	();  virtual sockbuf	accept	(sockAddr& sa);  int			read	(void* buf, int len);  int			recv	(void* buf, int len, int msgf=0);  int			recvfrom(sockAddr& sa,void* buf, int len, int msgf=0);#if !defined(__linux__) && !defined(_WIN32)  int			recvmsg (msghdr* msg, int msgf=0);  int			sendmsg	(msghdr* msg, int msgf=0);#endif  int			write	(const void* buf, int len);  int			send	(const void* buf, int len, int msgf=0);  int			sendto	(sockAddr& sa,const void* buf, int len, int msgf=0);  int			sendtimeout (int wp=-1);  int			recvtimeout (int wp=-1);  int			is_readready (int wp_sec, int wp_usec=0) const;  int			is_writeready (int wp_sec, int wp_usec=0) const;  int			is_exceptionpending (int wp_sec, int wp_usec=0) const;  void		shutdown (shuthow sh);  int			getopt(option op, void* buf,int len,			       level l=sol_socket) const;  int           setBlocking(bool blocking);  void		setopt(option op, void* buf,int len,                       level l=sol_socket) const;  type		gettype () const;  int			clearerror () const;  int			debug	  (int opt= -1) const;  int			reuseaddr (int opt= -1) const;  int			keepalive (int opt= -1) const;  int			dontroute (int opt= -1) const;  int			broadcast (int opt= -1) const;  int			oobinline (int opt= -1) const;  int			linger    (int tim= -1) const;  int			sendbufsz (int sz=-1)   const;  int			recvbufsz (int sz=-1)   const;  void		error (const char* errmsg) const;};class SWIUTIL_API_CLASS isockstream: public istream{ protected:  isockstream ():    istream (0)  {} public:  isockstream(sockbuf* sb):    istream (sb)  {}  virtual ~isockstream ();  sockbuf*		rdbuf () { return static_cast<sockbuf*>(ios::rdbuf());}  sockbuf*		operator -> () { return rdbuf(); }};class SWIUTIL_API_CLASS osockstream: public ostream{ protected:  osockstream():    ostream (0)  {} public:  osockstream(sockbuf* sb):    ostream (sb)  {}  virtual ~osockstream ();  sockbuf*		rdbuf () { return static_cast<sockbuf*>(ios::rdbuf());}  sockbuf*		operator -> () { return rdbuf(); }};class SWIUTIL_API_CLASS iosockstream: public iostream{ protected:  iosockstream ():    iostream (0)  {} public:  iosockstream(sockbuf *sb):    iostream (sb)  {}  virtual ~iosockstream ();  sockbuf*		rdbuf () { return static_cast<sockbuf*>(ios::rdbuf());}  sockbuf*		operator -> () { return rdbuf(); }};#endif	// _SOCKSTREAM_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -