X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fsocket.h;h=f97588415b1e5df052b1138a1e706f596810fc0b;hb=21c596567e3b6fd794ed6af73d304ce2bc70e58f;hp=f275a7e2b35a0712fd97f78fe6774e226fdce8fe;hpb=f59eded7c3e162bbdfc6db424c9badc730017698;p=libs%2Fnet.git diff --git a/source/socket.h b/source/socket.h index f275a7e..f975884 100644 --- a/source/socket.h +++ b/source/socket.h @@ -1,49 +1,53 @@ -/* $Id$ - -This file is part of libmspnet -Copyright © 2008 Mikkosoft Productions, Mikko Rasa -Distributed under the LGPL -*/ - #ifndef MSP_NET_SOCKET_H_ #define MSP_NET_SOCKET_H_ -#include +#include +#include #include "constants.h" #include "sockaddr.h" -#include "types.h" namespace Msp { namespace Net { -class Socket: public IO::Base +#ifdef WIN32 +typedef int socklen_t; +#endif + + +class bad_socket_state: public std::logic_error { public: - void set_block(bool); - IO::Handle get_event_handle(); + bad_socket_state(const std::string &w): std::logic_error(w) { } + virtual ~bad_socket_state() throw() { } +}; - bool get_connected() const { return connected; } - void bind(const SockAddr &); - virtual int connect(const SockAddr &) =0; - void close(); - const SockAddr &get_local_address() const; - const SockAddr &get_peer_address() const; - ~Socket(); + +class Socket: public IO::EventObject +{ protected: - SocketHandle handle; -#ifdef WIN32 - IO::Handle event; -#endif - bool connected; - SockAddr *local_addr; - SockAddr *peer_addr; + struct Private; + + Private *priv; + SockAddr *local_addr; - Socket(SocketHandle, const SockAddr &); + Socket(const Private &); Socket(Family, int, int); - void check_state(bool) const; - int get_option(int, int, void *, socklen_t *); - unsigned do_write(const char *, unsigned); - unsigned do_read(char *, unsigned); +public: + ~Socket(); + + virtual void set_block(bool); + virtual const IO::Handle &get_event_handle(); + + /** Associates the socket with a local address. There must be no existing + users of the address. */ + void bind(const SockAddr &); + + const SockAddr &get_local_address() const; + + void set_timeout(const Time::TimeDelta &); +protected: + int set_option(int, int, const void *, socklen_t); + int get_option(int, int, void *, socklen_t *) const; }; } // namespace Net