#ifndef __XRDNETMSG_H__ #define __XRDNETMSG_H__ /******************************************************************************/ /* */ /* X r d N e t M s g . h h */ /* */ /* (c) 2007 by the Board of Trustees of the Leland Stanford, Jr., University */ /* All Rights Reserved */ /* 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/XrdNetAddr.hh" class XrdSysError; class XrdNetMsg { public: //------------------------------------------------------------------------------ //! Send a UDP message to an endpoint. //! //! @param buff The data to send. //! @param blen Length of the data in buff. If not specified, the length is //! computed as strlen(buff). //! @param dest The endpint name which can be host:port or a named socket. //! If dest is zero, uses dest specified in the constructor. //! @param timeout maximum seconds to wait for a idle socket. When negative, //! the default, no time limit applies. //! @return <0 Message not sent due to error. //! @return =0 Message send (well as defined by UDP) //! @return >0 Message not sent, timeout occured. //------------------------------------------------------------------------------ int Send(const char *buff, // The data to be send int blen=0, // Length (strlen(buff) if zero) const char *dest=0, // Hostname to send UDP datagram int tmo=-1); // Timeout in ms (-1 = none) //------------------------------------------------------------------------------ //! Send a UDP message to an endpoint using an I/O vector. //! //! @param iov The vector of data to send. Total amount be <= 4096 bytes. //! @param iovcnt The number of elements in the vector. //! @param dest The endpint name which can be host:port or a named socket. //! If dest is zero, uses dest specified in the constructor. //! @param timeout maximum seconds to wait for a idle socket. When negative, //! the default, no time limit applies. //! @return <0 Message not sent due to error. //! @return =0 Message send (well as defined by UDP) //! @return >0 Message not sent, timeout occured. //------------------------------------------------------------------------------ int Send(const struct iovec iov[], // Remaining parms as above int iovcnt, // Number of elements in iovec const char *dest=0, // Hostname to send UDP datagram int tmo=-1); // Timeout in ms (-1 = none) //------------------------------------------------------------------------------ //! Constructor //! //! @param erp The error message object for routing error messages. //! @param aOK If supplied, set to true upon success; false otherwise. //! @param dest The endpint name which can be host:port or a named socket. //! This becomes the default endpoint. Any specified endpoint //! to send must be in the same family (e.g. UNIX). If not //! specified, then an endpoint must always be specified with //! send and is restricted to be in the INET family. //------------------------------------------------------------------------------ XrdNetMsg(XrdSysError *erp, const char *dest=0, bool *aOK=0); //------------------------------------------------------------------------------ //! Destructor //------------------------------------------------------------------------------ ~XrdNetMsg() {if (FD >= 0) close(FD);} protected: int OK2Send(int timeout, const char *dest); int retErr(int ecode, const char *theDest); int retErr(int ecode, XrdNetAddr *theDest); XrdSysError *eDest; XrdNetAddr dfltDest; XrdNetAddr specDest; int destOK; int FD; }; #endif