]> git.tdb.fi Git - libs/net.git/blob - source/net/streamserversocket.cpp
Implement an asynchronous name resolver class
[libs/net.git] / source / net / streamserversocket.cpp
1 #ifdef WIN32
2 #include <winsock2.h>
3 #endif
4 #include <cerrno>
5 #include <msp/core/refptr.h>
6 #include <msp/core/systemerror.h>
7 #include <msp/io/handle_private.h>
8 #include <msp/strings/format.h>
9 #include "sockaddr_private.h"
10 #include "socket_private.h"
11 #include "streamserversocket.h"
12 #include "streamsocket.h"
13
14 using namespace std;
15
16 namespace Msp {
17 namespace Net {
18
19 StreamServerSocket::StreamServerSocket(Family af, int proto):
20         ServerSocket(af, SOCK_STREAM, proto),
21         listening(false)
22 { }
23
24 void StreamServerSocket::listen(const SockAddr &addr, unsigned backlog)
25 {
26         bind(addr);
27
28         int err = ::listen(priv->handle, backlog);
29         if(err==-1)
30                 throw system_error("listen");
31
32 #ifdef WIN32
33         WSAEventSelect(priv->handle, *priv->event, FD_ACCEPT);
34 #endif
35         set_events(IO::P_INPUT);
36
37         listening = true;
38 }
39
40 StreamSocket *StreamServerSocket::accept()
41 {
42         if(!listening)
43                 throw bad_socket_state("not listening");
44
45         SockAddr::SysAddr sa;
46         Private new_p;
47         new_p.handle = ::accept(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), &sa.size);
48
49         RefPtr<SockAddr> paddr = SockAddr::new_from_sys(sa);
50         return new StreamSocket(new_p, *paddr);
51 }
52
53 } // namespace Net
54 } // namespace Msp