1 #include "platform_api.h"
2 #include "clientsocket.h"
3 #include <msp/core/systemerror.h>
4 #include "socket_private.h"
11 ClientSocket::ClientSocket(Family af, int type, int proto):
12 Socket(af, type, proto)
15 ClientSocket::ClientSocket(const Private &p, const SockAddr &paddr):
18 peer_addr(paddr.copy())
21 ClientSocket::~ClientSocket()
23 signal_flush_required.emit();
26 void ClientSocket::shutdown(IO::Mode m)
33 else if(m==IO::M_WRITE)
35 else if(m==IO::M_RDWR)
40 else if(m==IO::M_WRITE)
42 else if(m==IO::M_RDWR)
48 ::shutdown(priv->handle, how);
52 const SockAddr &ClientSocket::get_peer_address() const
55 throw bad_socket_state("not connected");
59 size_t ClientSocket::do_write(const char *buf, size_t size)
61 check_access(IO::M_WRITE);
63 throw bad_socket_state("not connected");
68 return check_sys_error(::send(priv->handle, buf, size, 0), "send");
71 size_t ClientSocket::do_read(char *buf, size_t size)
73 check_access(IO::M_READ);
75 throw bad_socket_state("not connected");
77 // XXX This breaks level-triggered semantics on Windows
81 make_signed<size_t>::type ret = ::recv(priv->handle, buf, size, 0);
86 set_socket_events(S_NONE);
92 return check_sys_error(ret, "recv");