123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- // Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
- //
- // Permission to use, copy, modify, and/or distribute this software for any
- // purpose with or without fee is hereby granted, provided that the above
- // copyright notice and this permission notice appear in all copies.
- //
- // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- // PERFORMANCE OF THIS SOFTWARE.
- #ifndef __UDP_SOCKET_H
- #define __UDP_SOCKET_H 1
- #ifndef ASIO_HPP
- #error "asio.hpp must be included before including this, see asiolink.h as to why"
- #endif
- #include <cstddef>
- #include <asiolink/io_socket.h>
- #include <asiolink/io_service.h>
- namespace asiolink {
- /// \brief The \c UDPSocket class is a concrete derived class of
- /// \c IOSocket that represents a UDP socket.
- ///
- /// Other notes about \c TCPSocket applies to this class, too.
- class UDPSocket : public IOSocket {
- private:
- /// \brief Class is non-copyable
- UDPSocket(const UDPSocket&);
- UDPSocket& operator=(const UDPSocket&);
- public:
- enum {
- MAX_SIZE = 4096 // Send and receive size
- };
-
- /// \brief Constructor from an ASIO UDP socket.
- ///
- /// \param socket The ASIO representation of the UDP socket.
- UDPSocket(asio::ip::udp::socket& socket) :
- socket_ptr_(NULL), socket_(socket)
- {}
- /// \brief Constructor
- ///
- /// Used when the UDPSocket is being asked to manage its own internal
- /// socket.
- UDPSocket(IOService& service);
- /// \brief Destructor
- virtual ~UDPSocket();
- virtual int getNative() const { return (socket_.native()); }
- virtual int getProtocol() const { return (IPPROTO_UDP); }
- /// \brief Open Socket
- ///
- /// Opens the UDP socket. In the model for transport-layer agnostic I/O,
- /// an "open" operation includes a connection to the remote end (which
- /// may take time). This does not happen for UDP, so the method returns
- /// "false" to indicate that the operation completed synchronously.
- ///
- /// \param endpoint Endpoint to which the socket will connect to.
- /// \param callback Unused.
- ///
- /// \return false to indicate that the "operation" completed synchronously.
- virtual bool open(const IOEndpoint* endpoint, IOCompletionCallback&);
- /// \brief Send Asynchronously
- ///
- /// This corresponds to async_send_to() for UDP sockets and async_send()
- /// for TCP. In both cases an endpoint argument is supplied indicating the
- /// target of the send - this is ignored for TCP.
- ///
- /// \param data Data to send
- /// \param length Length of data to send
- /// \param endpoint Target of the send
- /// \param callback Callback object.
- virtual void asyncSend(const void* data, size_t length,
- const IOEndpoint* endpoint, IOCompletionCallback& callback);
- /// \brief Receive Asynchronously
- ///
- /// This correstponds to async_receive_from() for UDP sockets and
- /// async_receive() for TCP. In both cases, an endpoint argument is
- /// supplied to receive the source of the communication. For TCP it will
- /// be filled in with details of the connection.
- ///
- /// \param data Buffer to receive incoming message
- /// \param length Length of the data buffer
- /// \param cumulative Amount of data that should already be in the buffer.
- /// (This is ignored - every UPD receive fills the buffer from the start.)
- /// \param endpoint Source of the communication
- /// \param callback Callback object
- virtual void asyncReceive(void* data, size_t length, size_t cumulative,
- IOEndpoint* endpoint, IOCompletionCallback& callback);
- /// \brief Checks if the data received is complete.
- ///
- /// As all the data is received in one I/O, so this is, this is effectively
- /// a no-op (although it does update the amount of data received).
- ///
- /// \param data Data buffer containing data to date. (This is ignored
- /// for UDP receives.)
- /// \param length Amount of data received in last asynchronous I/O
- /// \param cumulative On input, amount of data received before the last
- /// I/O. On output, the total amount of data received to date.
- ///
- /// \return true if the receive is complete, false if another receive is
- /// needed.
- virtual bool receiveComplete(void*, size_t length, size_t& cumulative) {
- cumulative = length;
- return (true);
- }
- /// \brief Cancel I/O On Socket
- virtual void cancel();
- /// \brief Close socket
- virtual void close();
- private:
- // Two variables to hold the socket - a socket and a pointer to it. This
- // handles the case where a socket is passed to the UDPSocket on
- // construction, or where it is asked to manage its own socket.
- asio::ip::udp::socket* socket_ptr_; ///< Pointer to the socket
- asio::ip::udp::socket& socket_; ///< Socket
- };
- } // namespace asiolink
- #endif // __UDP_SOCKET_H
|