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

📄 sockstream.h

📁 Linux下基本Socket以及管道
💻 H
字号:
// sockstream.h -*- C++ -*- socket library// Copyright (C) 2002 Herbert Straub//// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program; if not, write to the Free Software// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.// // Copyright (C) 1992-1996 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: 12Jan97 1.11//// Version: 1.2 2002-07-25 Herbert Straub // 	Improved Error Handling - extending the sockerr class by cOperation// 2003-03-06 Herbert Straub// 	adding sockbuf::getname und setname (sockname)// 	sockbuf methods throw method name + sockname#ifndef _SOCKSTREAM_H#define	_SOCKSTREAM_H#include <iostream> // must be ANSI compatible#include <cstddef>#include <ctype.h>#include <stdio.h>#include <string.h>#include <string>#include <cstdio>
#ifndef WIN32#	include <sys/types.h>#	include <sys/uio.h>#	include <sys/socket.h>
#	define SOCKET int
#	define SOCKET_ERROR -1
#else
#	include <Wininet.h>
#	pragma comment(lib, "Wininet")
#endif#ifdef __linux__#  define MSG_MAXIOVLEN	 16#endif // __linux__// socket exception classesclass sockerr {  int  err;  std::string text;public:  sockerr (int e, const char *operation = NULL): err (e) {	if (operation != NULL) {		text = operation;	}  }  sockerr (int e, const char *operation, const char *specification) : err (e) {	if (operation != NULL)		text = operation;	if (specification != NULL) {		text += "(";		text += specification;		text += ")";	}  }  sockerr (int e, const std::string &operation): err (e) {	text = operation;  }  sockerr (const sockerr &O) {	  err = O.err;	  text = O.text;  }  const char* what () const { return "sockerr"; }  const char* operation () const { return text.c_str(); }//  int errno () const { return err; }  int serrno () const { return err; } // LN  const char* errstr () const;  bool error (int eno) const { return eno == err; }  bool io () const; // non-blocking and interrupt io recoverable error.  bool arg () const; // incorrect argument supplied. recoverable error.  bool op () const; // operational error. recovery difficult.  bool conn () const;   // connection error  bool addr () const;   // address error  bool benign () const; // recoverable read/write error like EINTR etc.};class sockoob {public:  const char* what () const { return "sockoob"; }};  // socket address classesstruct sockaddr;class sockAddr {public:  virtual		~sockAddr() {}      virtual		operator void*	() const =0;                        operator sockaddr* () const { return addr (); }  virtual int		size 		() const =0;  virtual int		family		() const =0;  virtual sockaddr*     addr 		() const =0;};struct msghdr;// socket buffer classclass sockbuf: public std::streambuf {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_reuseaddr	= SO_REUSEADDR,    so_keepalive	= SO_KEEPALIVE,    so_dontroute	= SO_DONTROUTE,    so_broadcast	= SO_BROADCAST,    so_linger	        = SO_LINGER,    so_oobinline	= SO_OOBINLINE,    so_sndbuf		= SO_SNDBUF,    so_rcvbuf		= SO_RCVBUF,    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,#if !(defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__))    msg_maxiovlen	= MSG_MAXIOVLEN#endif  };  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) {}  };  typedef char          char_type;  typedef std::streampos     pos_type;  typedef std::streamoff     off_type;  typedef int           int_type;  typedef int           seekdir;  //  const int_type eof = EOF;  enum { eof = EOF }; // LN  struct sockdesc {    int sock;    sockdesc (int d): sock (d) {}  };protected:  struct sockcnt {    SOCKET	sock;    int			cnt;    int			stmo; // -1==block, 0==poll, >0 == waiting time in secs    int			rtmo; // -1==block, 0==poll, >0 == waiting time in secs    bool		oob;	// check for out-of-band byte while reading    void*		gend; // end of input buffer    void*		pend; // end of output buffer    sockcnt(SOCKET s)      : sock(s), cnt(1), stmo (-1), rtmo (-1), oob (false),        gend (0), pend (0) {}  };  sockcnt* rep;  // counts the # refs to sock  std::string		sockname; // name of sockbuf - Herbert Straub#if 0  virtual sockbuf*      setbuf (char_type* s, int_type* n);  virtual pos_type      seekoff (off_type off,				 seekdir way,				 std::ios::openmode which = ios::in|ios::out);  virtual pos_type      seekpos (pos_type sp,		  		 std::ios::openmode which = ios::in|ios::out);#endif  virtual int           sync ();    virtual int           showmanyc () const;  virtual std::streamsize    xsgetn (char_type* s, std::streamsize n);  virtual int_type      underflow ();  virtual int_type      uflow ();  virtual int_type      pbackfail (int_type c = eof);  virtual std::streamsize    xsputn (const char_type* s, std::streamsize n);  virtual int_type      overflow (int_type c = eof);public:                        sockbuf (const sockdesc& sd);                        sockbuf (int domain, type, int proto);                        sockbuf (const sockbuf&);//  sockbuf&		operator = (const sockbuf&);  virtual 		~sockbuf ();  int                   sd () const { return rep->sock; }  int                   pubsync () { return sync (); }  virtual bool          is_open () const;      virtual void		bind	(sockAddr&);  virtual void		connect	(sockAddr&);      void		        listen	(int num=somaxconn);  virtual sockdesc	accept	();  virtual sockdesc	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(int op, void* buf, int len,			       int level=sol_socket) const;  void		        setopt(int op, void* buf, int len,		               int level=sol_socket) const;      type		        gettype () const;  int			clearerror () const;  bool			debug	  () const;  bool			debug	  (bool set) const;  bool			reuseaddr () const;  bool			reuseaddr (bool set) const;  bool			keepalive () const;  bool			keepalive (bool set) const;  bool			dontroute () const;  bool			dontroute (bool set) const;  bool			broadcast () const;  bool			broadcast (bool set) const;  bool			oobinline () const;  bool			oobinline (bool set) const;  bool                  oob       () const { return rep->oob; }  bool                  oob       (bool b);  int			sendbufsz () const;  int			sendbufsz (int sz)   const;  int			recvbufsz () const;  int			recvbufsz (int sz)   const;  socklinger            linger    () const;  socklinger		linger    (socklinger opt) const;  socklinger            linger    (int onoff, int tm) const    { return linger (socklinger (onoff, tm)); }  bool                  atmark    () const;    long                  nread     () const;  long                  howmanyc  () const;  void                  nbio      (bool set=true) const;  inline void		setname	  (const char *name);  inline void		setname	  (const std::string &name);  inline const std::string&	getname	  ();
#ifndef WIN32  void                  async     (bool set=true) const;
	int                   pgrp      () const;
  int                   pgrp      (int new_pgrp) const;
  void                  closeonexec (bool set=true) const;
#endif};class isockstream: public std::istream {protected://                        isockstream (): std::istream(rdbuf()), ios (0) {}public:                        isockstream(sockbuf* sb): std::ios (sb), std::istream(sb) {}  virtual               ~isockstream () {}		          sockbuf*		rdbuf () { return (sockbuf*)std::ios::rdbuf(); }  sockbuf*		operator -> () { return rdbuf(); }};class osockstream: public std::ostream {protected:  //                      osockstream (): ostream(static_cast<>rdbuf()), std::ios (0) {}public:  			osockstream(sockbuf* sb): std::ios (sb), std::ostream(sb) {}  virtual		~osockstream () {}  sockbuf*		rdbuf () { return (sockbuf*)std::ios::rdbuf(); }  sockbuf*		operator -> () { return rdbuf(); }};class iosockstream: public std::iostream {protected:                        iosockstream ();public:                        iosockstream(sockbuf* sb): std::ios (sb), std::iostream(sb) {}  virtual               ~iosockstream () {}  sockbuf*		rdbuf () { return (sockbuf*)std::ios::rdbuf(); }  sockbuf*		operator -> () { return rdbuf(); }};// manipulatorsextern osockstream& crlf (osockstream&);extern osockstream& lfcr (osockstream&);// inlinevoid sockbuf::setname (const char *name){	sockname = name;}void sockbuf::setname (const std::string &name){	sockname = name;}const std::string& sockbuf::getname (){	return sockname;}#endif	// _SOCKSTREAM_H

⌨️ 快捷键说明

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