// -*- c++ -*- //------------------------------------------------------------------------------ // IPv4Socket.h //------------------------------------------------------------------------------ // Copyright (c) 1998 by Vladislav Grinchenko // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. //------------------------------------------------------------------------------ #ifndef IPV4_SOCKET_Hh #define IPV4_SOCKET_Hh #include "assa/Socket.h" #include "assa/Socketbuf.h" /** @file IPv4Socket.h Class IPv4Socket covers domain types AF_INET and AF_UNIX. IPv4Socket does internal buffering via Socketbuf. */ namespace ASSA { class IPv4Socket : public Socket { public: /// Maximum TCP data frame (no options) static const int MAXTCPBUFSZ; /// Default constructor IPv4Socket() : m_path (0), m_rdbuf (new Socketbuf (this)) { trace_with_mask("IPv4Socket::IPv4Socket()",SOCKTRACE); } /** Constructor from file descriptor. * @param fd_ file descriptor to use */ IPv4Socket(const handler_t fd_) : m_path (0), m_rdbuf (new Socketbuf (this)) { trace_with_mask("IPv4Socket::IPv4Socket(fd_)",SOCKTRACE); m_fd = fd_; // inherited from the parent class } /** Destructor will close connection */ ~IPv4Socket() { trace_with_mask("IPv4Socket::~IPv4Socket",SOCKTRACE); this->close (); if (m_rdbuf != 0) { delete m_rdbuf; } } /** "Virtual constructor". clone() function creates an exact copy of Socket by dup(2)-ing file descriptor and copying Socket's internal state. */ IPv4Socket* clone () const; /** Create socket. Socket domain type is specified as * AF_INET for internet socket and AF_UNIX for UNIX domain socket * (full duplex pipe). * * @param domain_ domain * @return true if socket is created successfully, false otherwise */ bool open(const int domain_); /** Close socket connection. * @return true if success, fail if call to ::close() failed. */ bool close(); /** Client makes connection with the server at address_. * If socket is set to non-blocking mode, most likely connect() * would return false with errno set to EINPROGRESS. See * connect(2) manpage for details. * * @param address_ peer address to connect with * @return true for success, false for error */ bool connect(const Address& address_); /** Server binds listening socket to its local well-known port. * This call should follow the call to open() and precede * the call to accept(). * * @param my_address_ address to bind to * @return true if success, false otherwise */ virtual bool bind (const Address& my_address_); /** Accept connection on the listening socket. * Returned is a COMPLETED connection (meaning that socket pair * is ready for data transfer and doesn't need call to ::open()). * This method will block waiting on connection to come if there * is no connection requests waiting on the listenning socket queue. * To avoid blocking, use ::select() first. * * @return newly created connected socket to the client, * or 0 if error. */ IPv4Socket* accept (); /** Read packet of specified size and save it to the given * buffer. * * @param buf_ buffer where packet will be stored * @param size_ size of the packet to expect * * @return number of bytes read or -1 on error * indicating the reason in errno. 0 is returned * if remote host closed its socket connection. */ int read (char* buf_, const unsigned int size_); /** Perform blocking write by writing packet of specified size. * * @param buf_ buffer to send * @param size_ packet size * @return number of bytes written or -1 for error */ int write (const char* buf_, const unsigned int size_); /// Get socket file descriptor handler_t getHandler () const { return m_fd; } /// Get socket domain type const int getDomain () const { return m_type; } /** Return a pointer to the Socketbuf associated with the stream. This is part of the construction of a stream, and the buffer class object is not normally changed. This function may be used to get at Socketbuf functionality directly, given a Socket object. */ virtual Streambuf* rdbuf () { return m_rdbuf; } /** Set new Socketbuf for internal IO buffering. IPv4Socket object assumes full ownership of the memory pointed by sb_ (it will be release when ~IPv4Socket destructor is called). @return Old Socketbuf object or sb_ if it is either NULL or matches old Socketbuf object. */ virtual Streambuf* rdbuf (Streambuf* sb_); /** This function returns the number of characters immediately available in the get area of the underlying Socketbuf buffer without making a system call if Socket is doing buffering I/O. */ virtual int in_avail () const { return m_rdbuf->in_avail (); } private: // No copying IPv4Socket (const IPv4Socket&); IPv4Socket& operator= (const IPv4Socket&); private: //@{ /// Path of UNIX domain socket char* m_path; /// Socketbuf Streambuf* m_rdbuf; }; } // end namespace ASSA #endif // IPV4_SOCKET_Hh