]> git.tdb.fi Git - libs/net.git/blob - source/net/streamserversocket.cpp
Move most platform-specific code into overlay directories
[libs/net.git] / source / net / streamserversocket.cpp
1 #include "platform_api.h"
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 "sockaddr_private.h"
7 #include "socket_private.h"
8 #include "streamserversocket.h"
9 #include "streamsocket.h"
10
11 using namespace std;
12
13 namespace Msp {
14 namespace Net {
15
16 StreamServerSocket::StreamServerSocket(Family af, int proto):
17         ServerSocket(af, SOCK_STREAM, proto),
18         listening(false)
19 { }
20
21 void StreamServerSocket::listen(const SockAddr &addr, unsigned backlog)
22 {
23         bind(addr);
24
25         int err = ::listen(priv->handle, backlog);
26         if(err==-1)
27                 throw system_error("listen");
28
29         set_socket_events(S_ACCEPT);
30
31         listening = true;
32 }
33
34 StreamSocket *StreamServerSocket::accept()
35 {
36         if(!listening)
37                 throw bad_socket_state("not listening");
38
39         SockAddr::SysAddr sa;
40         Private new_p;
41         new_p.handle = ::accept(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), &sa.size);
42
43         RefPtr<SockAddr> paddr = SockAddr::new_from_sys(sa);
44         return new StreamSocket(new_p, *paddr);
45 }
46
47 } // namespace Net
48 } // namespace Msp