X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fsocket.h;h=861012b8cc50c0bb2114440f0de2439fcacaa744;hb=4b408e693bcb004ccaa6958610e946cfbeff9465;hp=db4206cb7546a5f84e7345035def471a3b09c0e5;hpb=35009eb3f51a6fd0f9261f892a85d97d81e69886;p=libs%2Fnet.git diff --git a/source/socket.h b/source/socket.h index db4206c..861012b 100644 --- a/source/socket.h +++ b/source/socket.h @@ -1,49 +1,59 @@ -/* $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 -{ -protected: - SocketHandle handle; #ifdef WIN32 - IO::Handle event; +typedef int socklen_t; #endif - bool connected; - SockAddr *local_addr; - SockAddr *peer_addr; - Socket(SocketHandle, const SockAddr &); + +class bad_socket_state: public std::logic_error +{ +public: + bad_socket_state(const std::string &w): std::logic_error(w) { } + virtual ~bad_socket_state() throw() { } +}; + + +class Socket: public IO::EventObject +{ +protected: + struct Private; + + Private *priv; + bool connected; + SockAddr *local_addr; + SockAddr *peer_addr; + + Socket(const Private &, const SockAddr &); Socket(Family, int, int); public: ~Socket(); void set_block(bool); - IO::Handle get_event_handle(); + const IO::Handle &get_event_handle(); bool is_connected() const { return connected; } + + /** Associates the socket with a local address. There must be no existing + users of the address. */ void bind(const SockAddr &); - virtual int connect(const SockAddr &) =0; - void close(); + + /** Connects to a remote address. Exact semantics depend on the socket + type. */ + virtual int connect(const SockAddr &) = 0; + void set_timeout(const Time::TimeDelta &); const SockAddr &get_local_address() const; const SockAddr &get_peer_address() const; protected: - void check_state(bool) const; int set_option(int, int, const void *, socklen_t); int get_option(int, int, void *, socklen_t *) const; unsigned do_write(const char *, unsigned);