-#include <cerrno>
+#include "platform_api.h"
#include <msp/core/refptr.h>
#include <msp/core/systemerror.h>
#include <msp/io/handle_private.h>
namespace Net {
StreamServerSocket::StreamServerSocket(Family af, int proto):
- ServerSocket(af, SOCK_STREAM, proto),
- listening(false)
+ ServerSocket(af, SOCK_STREAM, proto)
{ }
void StreamServerSocket::listen(const SockAddr &addr, unsigned backlog)
{
+ if(listening)
+ throw bad_socket_state("already listening");
+
bind(addr);
int err = ::listen(priv->handle, backlog);
if(err==-1)
throw system_error("listen");
-#ifdef WIN32
- WSAEventSelect(priv->handle, *priv->event, FD_ACCEPT);
-#endif
- set_events(IO::P_INPUT);
+ set_socket_events(S_ACCEPT);
listening = true;
}
SockAddr::SysAddr sa;
Private new_p;
- new_p.handle = ::accept(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), &sa.size);
+ new_p.handle = check_sys_error(::accept(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), &sa.size), "accept");
RefPtr<SockAddr> paddr = SockAddr::new_from_sys(sa);
return new StreamSocket(new_p, *paddr);