--- /dev/null
+#ifndef MSP_NET_CLIENTSOCKET_H_
+#define MSP_NET_CLIENTSOCKET_H_
+
+#include "socket.h"
+
+namespace Msp {
+namespace Net {
+
+/**
+ClientSockets are used for sending and receiving data over the network.
+*/
+class ClientSocket: public Socket
+{
+public:
+ /** Emitted when the socket finishes connecting. */
+ sigc::signal<void, const std::exception *> signal_connect_finished;
+
+protected:
+ bool connecting;
+ bool connected;
+ SockAddr *peer_addr;
+
+ ClientSocket(const Private &, const SockAddr &);
+ ClientSocket(Family, int, int);
+public:
+ virtual ~ClientSocket();
+
+ /** Connects to a remote address. Exact semantics depend on the socket
+ type. Returns true if the connection was established, false if it's in
+ progress. */
+ virtual bool connect(const SockAddr &) = 0;
+
+ /** Checks the status of a connection being established. Returns true if
+ the connection was established successfully, false if it's still in
+ progress. If an error occurred, an exception is thrown. */
+ virtual bool poll_connect(const Time::TimeDelta &) = 0;
+
+ bool is_connecting() const { return connecting; }
+ bool is_connected() const { return connected; }
+
+ const SockAddr &get_peer_address() const;
+protected:
+ virtual unsigned do_write(const char *, unsigned);
+ virtual unsigned do_read(char *, unsigned);
+};
+
+} // namespace Net
+} // namespace Msp
+
+#endif