#include <msp/io/handle.h>
#include "constants.h"
#include "sockaddr.h"
-#include "types.h"
namespace Msp {
namespace Net {
+#ifdef WIN32
+typedef int socklen_t;
+#endif
+
+
class bad_socket_state: public std::logic_error
{
public:
class Socket: public IO::EventObject
{
protected:
- SocketHandle handle;
- IO::Handle event;
- bool connected;
+ struct Private;
+
+ Private *priv;
SockAddr *local_addr;
- SockAddr *peer_addr;
- Socket(SocketHandle, const SockAddr &);
+ Socket(const Private &);
Socket(Family, int, int);
public:
~Socket();
- void set_block(bool);
- const IO::Handle &get_event_handle();
+ virtual void set_block(bool);
+ virtual 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 &);
- /** Connects to a remote address. Exact semantics depend on the socket
- type. */
- virtual int connect(const SockAddr &) = 0;
+ const SockAddr &get_local_address() const;
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);
- unsigned do_read(char *, unsigned);
};
} // namespace Net