2 #include <msp/core/refptr.h>
3 #include <msp/core/systemerror.h>
4 #include <msp/io/handle_private.h>
5 #include <msp/strings/format.h>
6 #include "socket_private.h"
7 #include "streamlistensocket.h"
8 #include "streamsocket.h"
15 StreamListenSocket::StreamListenSocket(Family af, int proto):
16 Socket(af, SOCK_STREAM, proto),
20 int StreamListenSocket::connect(const SockAddr &)
22 // XXX This function needs to go away
23 throw logic_error("Can't connect a listen socket");
26 void StreamListenSocket::listen(const SockAddr &addr, unsigned backlog)
30 int err = ::listen(priv->handle, backlog);
32 throw system_error("listen");
35 WSAEventSelect(priv->handle, *priv->event, FD_ACCEPT);
37 set_events(IO::P_INPUT);
42 StreamSocket *StreamListenSocket::accept()
45 throw bad_socket_state("not listening");
48 socklen_t size = sizeof(sockaddr_storage);
50 new_p.handle = ::accept(priv->handle, reinterpret_cast<sockaddr *>(&sa), &size);
52 RefPtr<SockAddr> paddr = SockAddr::create(sa);
53 return new StreamSocket(new_p, *paddr);