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

📄 socket.h

📁 发布/订阅系统中间件
💻 H
字号:
// -*- C++ -*-////  This file is part of Siena, a wide-area event notification system.//  See http://www.cs.colorado.edu/serl/dot/siena.html////  Author: Antonio Carzaniga <carzanig@cs.colorado.edu>//  See the file AUTHORS for full details. ////  Copyright (C) 1998-1999 University of Colorado////  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307,//  USA, or send email to serl@cs.colorado.edu.//// // $Id: Socket.h,v 1.2 2002/11/22 17:52:35 carzanig Exp $////// This is going to be my ultimate Socket C++ library right now, it's// limited to IP sockets. There are probably numerous libraries on the// net that do pretty much the same. However I suspect this is going// to be a crucial piece of library whenever I decide to implement a// real (robust) Siena, so I want to have `total' control over this// stuff. Needless to say this is ...work in progress...//#ifndef _Socket_h#define _Socket_h/*#include <sienaconf.h>#include <sys/types.h>#include <sys/socket.h>#include <in.h>*/
#define buffer_size 4096
 
  #define   MAXHOSTNAMELEN   256   
  

#include <winsock2.h>#include <iostream>#include <streambuf>#include <exception>class INAddress;class SocketRep;class TCPSocketRep;class Socket;class TCPSocket;class UDPSocket;	// not yet implementedclass TCPPort;class UDPPort;		// not yet implementedtypedef signed int  ssize_t;
using namespace std;//// exceptions//class SocketError;class INAddress: public sockaddr_in {public:    //    // all these ifdefs should be replaced by some autoconf macros    // ...work in progress...    ////    typedef in_addr_t		ip_address_type;//    typedef socklen_t		size_type;//    typedef in_port_t		port_type;    typedef unsigned int		ip_address_type;
    typedef unsigned int		size_type;
    typedef unsigned int		port_type;public:				INAddress();				INAddress(const INAddress &);				INAddress(port_type);				INAddress(const char *s, port_type);    void			set_host_port(const char *, port_type);    void			set_host(const char* host_name);    void			set_port(port_type);    INAddress &			operator = (const INAddress &);      bool			operator < (const INAddress &)		const;    bool			operator == (const INAddress &)		const;				operator void* ();    sockaddr_in *		addr_in();    sockaddr *			addr();    const sockaddr_in *		addr_in()				const;    const sockaddr *		addr()					const;    size_type			size()					const;    port_type			port()					const;    ip_address_type		host()					const;    const char *		hostname()				const;    static const INAddress &	this_host();};class SocketRep {    friend class Socket; protected:    int				fd;    unsigned int		ref_count; public:				SocketRep();				SocketRep(int type);    virtual			~SocketRep();};class TCPPortRep : public SocketRep { public:				TCPPortRep();				TCPPortRep(int f);};class SocketBuffer : public streambuf {    //    // This is a stream buffer for sockets. filebuf isn't good enough    // because it can be in either PUT or GET mode, thus it doesn't    // implement a two-way communication buffer.    // protected:    virtual int                 sync();    virtual int                 showmanyc();    virtual streamsize          xsgetn(char * s, streamsize n);    virtual int                 underflow();    virtual int                 uflow();    virtual int                 pbackfail(int c = EOF);    virtual streamsize          xsputn(const char * s, streamsize n);    virtual int                 overflow(int c = EOF); public:				SocketBuffer(int & f);				~SocketBuffer();    //    // const buffer size for now...    ////    static const size_t		buffer_size = 4096;     private:    int &			fd;    char                        pbuf[buffer_size];    char                        gbuf[buffer_size];};class TCPSocketRep : public SocketRep {    friend class		TCPSocket;  protected:				TCPSocketRep();				TCPSocketRep(int f); private:    SocketBuffer		buf;};class Socket {    //    // this class is a common placeholder for generic socket    // operations (such as getsockoption...). The only active    // functionality provided by this class is the handling of the    // (shared) socket representation rep. A representation is    // overwritten by assign and erased by close.    //    // Every representation has at least a file descriptor,    // filedescr() gives access to it.    // public:				Socket();			// NULL rep				Socket(SocketRep *r);		// shared rep    void			assign(SocketRep *r);		// shared rep    void			close();    int				filedescr()				const;				~Socket();    //    // soclet operations    //    INAddress			peer_address()				const;    INAddress			local_address()				const;    //    bool			address_reuse()				const;    void			address_reuse(bool b);    // ...many more to add...    // ...work in progress...    // protected:    SocketRep *			rep;};class TCPSocket: public Socket, public iostream { public:    TCPSocket();			// null rep				TCPSocket(int f);		// new rep				TCPSocket(const INAddress &);	// new rep				TCPSocket(const TCPSocket &s);	// shared rep    TCPSocket &			operator = (int f);    TCPSocket &			operator = (const TCPSocket &s);    void			connect(const INAddress &);};class TCPPort : public Socket { public:				TCPPort();				TCPPort(int f);				TCPPort(INAddress::port_type port,					bool reuse = true,					int maxconn = SOMAXCONN);				TCPPort(const TCPPort & p);    TCPPort &			operator = (int f);    TCPPort &			operator = (const TCPPort &s);    //    // to be continued like TCPSocket...    //    void			bind(INAddress::port_type port,				     bool reuse = true,				     int maxconn = SOMAXCONN);    int 			accept()				const;    int				accept(INAddress &addr)			const;};class UDPSocketRep : public SocketRep { public:				UDPSocketRep();				UDPSocketRep(int f);};class UDPSocket: public Socket {public:				UDPSocket();				UDPSocket(int f);		// new rep				UDPSocket(const UDPSocket &s);	// shared rep    UDPSocket &			operator = (int f);    UDPSocket &			operator = (const UDPSocket &s);    ssize_t			sendto(const INAddress &, 				       const void *msg, size_t len);    ssize_t			recvfrom(INAddress &, void *msg, size_t len);};class SocketError: public exception {public:    enum Type {	Unknown			= 0,	Create			= 1,	Bind			= 2,	Listen			= 3,	GetHostName		= 4,	Connect			= 5,	Accept			= 6,	NotConnected		= 7,	GetSockName		= 8,	GetPeerName		= 9,	GetAddressReuse		= 10,	SetAddressReuse		= 11,	SendTo			= 12,	ReceiveFrom		= 13,	Write			= 14,	Read			= 15,    };    Type			type;    int				errno_value;				SocketError(Type t=Unknown, int e = 0);    virtual const char *	what() const throw();};// // inline stuff//#ifndef NO_INLINE#include "Socket.icc"#endif#endif

⌨️ 快捷键说明

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