#ifndef __XRDNET_H__ #define __XRDNET_H__ /******************************************************************************/ /* */ /* X r d N e t . h h */ /* */ /* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */ /* Produced by Andrew Hanushevsky for Stanford University under contract */ /* DE-AC02-76-SFO0515 with the Department of Energy */ /* */ /* This file is part of the XRootD software suite. */ /* */ /* XRootD is free software: you can redistribute it and/or modify it under */ /* the terms of the GNU Lesser General Public License as published by the */ /* Free Software Foundation, either version 3 of the License, or (at your */ /* option) any later version. */ /* */ /* XRootD 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 Lesser General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU Lesser General Public License */ /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */ /* COPYING (GPL license). If not, see . */ /* */ /* The copyright holder's institutional names and contributor's names may not */ /* be used to endorse or promote products derived from this software without */ /* specific prior written permission of the institution or contributor. */ /******************************************************************************/ #include #include #ifndef WIN32 #include #include #include #include #else #include #endif #include "XrdNet/XrdNetOpts.hh" class XrdNetAddr; class XrdNetBufferQ; class XrdNetPeer; class XrdNetSecurity; class XrdSysError; class XrdNet { public: //------------------------------------------------------------------------------ //! Accept incoming TCP connection. This is the preferred method for TCP. //! //! @param myAddr the address object to contain connection information. //! @param opts processing options: //! XRDNET_DELAY - do not set nodelay on socket. //! XRDNET_KEEPALIVE - use TCP keep alive on socket. //! XRDNET_NOCLOSEX - do not allow socket to close on exec() //! XRDNET_NOEMSG - supress printing error messages //! XRDNET_NOLINGER - Do not linger when closing socket. //! @param timeout maximum seconds to wait for a conection. When negative, //! the default, no time limit applies. //! @return !0 Successful connection occurred, myAddr holds information. //! @return =0 Failure, a timeout or permanent error occurred. //------------------------------------------------------------------------------ int Accept(XrdNetAddr &myAddr, int opts=0, int timeout=-1); //------------------------------------------------------------------------------ //! Accept incoming TCP or UDP connection. This method should only be used for //! UDP-style networks. The previous method is preferred for TCP-style networks. //! //! @param myPeer the peer object to contain connection information. //! @param opts processing options: //! XRDNET_DELAY - TCP: do not set nodelay on socket. //! XRDNET_KEEPALIVE - TCP: use TCP keep alive on socket. //! XRDNET_NEWFD - UDP: obtain new file descriptor //! XRDNET_NOCLOSEX - ALL: keep socket across exec() calls //! XRDNET_NODNTRIM - ALL: don't trim domain name in myPeer //! XRDNET_NOEMSG - ALL: supress printing error messages //! XRDNET_NORLKUP - ALL: avoid doing reverse DNS look-up //! XRDNET_USETLS - ALL: enable TLS upon connection //! @param timeout maximum seconds to wait for a conection. When negative, //! the default, no time limit applies. //! @return !0 Successful connection occurred, myPeer holds information. //! @return =0 Failure, a timeout or permanent error occurred. //------------------------------------------------------------------------------ int Accept(XrdNetPeer &myPeer, int opts=0, int timeout=-1); //------------------------------------------------------------------------------ //! Bind a network object to a TCP or UDP port number. //! //! @param port the port number to bind to. Use 0 for arbitrary port. //! @param contype Either "tcp" for TCP networks or "udp" for UDP networks. //! //! @return 0 Successfully bound the port. //! @return !0 Failure, return value is -errno describing the error. //------------------------------------------------------------------------------ int Bind( int port, // Port number const char *contype="tcp" // "tcp" or "udp" ); //------------------------------------------------------------------------------ //! Bind a network object to a Unix named socket. //! //! @param path the file system path to a named socket to bind with. //! @param contype Either "stream" to use TCP-tyle streaming protocol or //! "datagram" to use UDP-style messaging. //! //! @return 0 Successfully bound the port. //! @return !0 Failure, return value is -errno describing the error. //------------------------------------------------------------------------------ int Bind( char *path, // Unix path < |109| const char *contype="stream" // stream | datagram ); //------------------------------------------------------------------------------ //! Create a TCP socket and connect it to the given host and port. This is the //! preferred method for making TCP based connections. //! //! @param myAddr address object where connection information is returned. //! @param dest destination hostname or IP address. //! @param port the port number to connect to. If < 0 then the dest param //! must contain the port number preceeded by a colon. //! @param opts processing options: //! XRDNET_NOCLOSEX - do not allow socket to close on exec() //! XRDNET_NOEMSG - supress printing error messages //! XRDNET_NORLKUP - avoid doing reverse DNS look-up //! @param timeout the maximum number of seconds to wait for the connection to //! complete. A negative value waits forever. Values greater //! than 255 seconds are set to 255. //! //! @return true Connection completed, myAddr holds connection information. //! @return false Connection failed. //------------------------------------------------------------------------------ int Connect(XrdNetAddr &myAddr, const char *dest, // Destination host or ip address int port=-1, // Port number int opts=0, // Options int timeout=-1 // Second timeout ); //------------------------------------------------------------------------------ //! Create a TCP or UDP socket and connect it to the given host and port. The //! previous method is preferred for creating TCP sockets. //! //! @param myPeer peer object where connection information is returned. //! @param dest destination hostname or IP address. //! @param port the port number to connect to. If < 0 then the dest param //! must contain the port number preceeded by a colon. //! @param opts processing options: //! XRDNET_NOCLOSEX - do not allow socket to close on exec() //! XRDNET_NODNTRIM - do not trim domain name in myPeer. //! XRDNET_NOEMSG - supress printing error messages //! XRDNET_NORLKUP - avoid doing reverse DNS look-up //! XRDNET_UDPSOCKET - create a UDP socket (o/w use TCP). //! @param timeout the maximum number of seconds to wait for the connection to //! complete. A negative value waits forever. Values greater //! than 255 seconds are set to 255. //! //! @return true Connection completed, myPeer holds connection information. //! @return false Connection failed. //------------------------------------------------------------------------------ int Connect(XrdNetPeer &myPeer, const char *dest, // Destination host or ip address int port=-1, // Port number int opts=0, // Options int timeout=-1 // Second timeout ); //------------------------------------------------------------------------------ //! Get the port number, if any, bound to this network. //! //! @return >0 The bound port number. //! @return <=0 The network is not bound to a port. //------------------------------------------------------------------------------ int Port() {return Portnum;} // Relay() creates a UDP socket and optionally decomposes a destination // of the form host:port. Upon success it fills in the Peer object // and return true (1). Upon failure, it returns false (0). // int Relay(XrdNetPeer &Peer, // Peer object to be initialized const char *dest, // Optional destination int opts=0 // Optional options as above ); int Relay(const char *dest); // Optional destination //------------------------------------------------------------------------------ //! Add a NetSecurity object to the existing accept() security constraints. //! //! @param secp Pointer to the network security object. This object must //! not be deleted nor directly used after the call as this //! object assumes its ownership and may delete it at any time. //------------------------------------------------------------------------------ virtual void Secure(XrdNetSecurity *secp); //------------------------------------------------------------------------------ //! Set network defaults. //! //! @param options The options to be added to Accept(), Bind() and Connect() //! calls. These options cannot be turned off, so be careful. //! @param buffsz The UDP buffer size (the initial default is 32K) or the TCP //! window size (initial default is OS dependent). //------------------------------------------------------------------------------ void setDefaults(int options, int buffsz=0) {netOpts = options; Windowsz = buffsz;} //------------------------------------------------------------------------------ //! Set network domain name. //! //! @param dname The domain name which indicates to Trim() what part of the //! host name is so common that it can be trimmed. //------------------------------------------------------------------------------ void setDomain(const char *dname) {if (Domain) free(Domain); Domain = strdup(dname); Domlen = strlen(dname); } //------------------------------------------------------------------------------ //! Trims off the domain name in a host name. //! //! @param hname The host name to be trimmed (it is modified). //------------------------------------------------------------------------------ void Trim(char *hname); //------------------------------------------------------------------------------ //! Unbind the network from any bound resouces. //------------------------------------------------------------------------------ void unBind(); //------------------------------------------------------------------------------ //! Get the current TCP RCVBUF window size. //! //! @return >0 The current window size. //! @return <=0 Either the network is not bound to a port or an error has //! occurred. Window size is unavailable. //------------------------------------------------------------------------------ int WSize(); //------------------------------------------------------------------------------ //! Constructor //! //! @param erp The error object for printing error messages. It must be //! supplied. //! @param secp The initial NetSecurity object. This secp object must not //! be deleted nor directly used after the call as this //! object assumes its ownership and may delete it at any time. //------------------------------------------------------------------------------ XrdNet(XrdSysError *erp, XrdNetSecurity *secp=0); //------------------------------------------------------------------------------ //! Destructor //------------------------------------------------------------------------------ virtual ~XrdNet(); protected: XrdSysError *eDest; XrdNetSecurity *Police; char *Domain; int Domlen; int iofd; int Portnum; int PortType; int Windowsz; int netOpts; int BuffSize; XrdNetBufferQ *BuffQ; private: int do_Accept_TCP(XrdNetAddr &myAddr, int opts); int do_Accept_TCP(XrdNetPeer &myPeer, int opts); int do_Accept_UDP(XrdNetPeer &myPeer, int opts); }; #endif