#include <msp/strings/format.h>
#include <msp/time/rawtime_private.h>
#include <msp/time/units.h>
+#include "sockaddr_private.h"
#include "socket.h"
#include "socket_private.h"
namespace Msp {
namespace Net {
-Socket::Socket(const Private &p, const SockAddr &paddr):
+Socket::Socket(const Private &p):
priv(new Private),
- connected(true),
- local_addr(0),
- peer_addr(paddr.copy())
+ local_addr(0)
{
priv->handle = p.handle;
- sockaddr_storage sa;
- socklen_t size = sizeof(sockaddr_storage);
- getsockname(priv->handle, reinterpret_cast<sockaddr *>(&sa), &size);
- local_addr = SockAddr::create(sa);
+ SockAddr::SysAddr sa;
+ getsockname(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), &sa.size);
+ local_addr = SockAddr::from_sys(sa);
#ifdef WIN32
*priv->event = CreateEvent(0, false, false, 0);
Socket::Socket(Family af, int type, int proto):
priv(new Private),
- connected(false),
- local_addr(0),
- peer_addr(0)
+ local_addr(0)
{
- priv->handle = socket(af, type, proto);
+ priv->handle = socket(family_to_sys(af), type, proto);
#ifdef WIN32
*priv->event = CreateEvent(0, false, false, 0);
Socket::~Socket()
{
- signal_flush_required.emit();
#ifdef WIN32
closesocket(priv->handle);
CloseHandle(*priv->event);
#endif
delete local_addr;
- delete peer_addr;
delete priv;
}
void Socket::bind(const SockAddr &addr)
{
- sockaddr_storage sa;
- unsigned size = addr.fill_sockaddr(sa);
+ SockAddr::SysAddr sa = addr.to_sys();
- int err = ::bind(priv->handle, reinterpret_cast<sockaddr *>(&sa), size);
+ int err = ::bind(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), sa.size);
if(err==-1)
throw system_error("bind");
local_addr = addr.copy();
}
+const SockAddr &Socket::get_local_address() const
+{
+ if(local_addr==0)
+ throw bad_socket_state("not bound");
+ return *local_addr;
+}
+
void Socket::set_timeout(const Time::TimeDelta &timeout)
{
#ifndef WIN32
#endif
}
-const SockAddr &Socket::get_local_address() const
-{
- if(local_addr==0)
- throw bad_socket_state("not bound");
- return *local_addr;
-}
-
-const SockAddr &Socket::get_peer_address() const
-{
- if(peer_addr==0)
- throw bad_socket_state("not connected");
- return *peer_addr;
-}
-
int Socket::set_option(int level, int optname, const void *optval, socklen_t optlen)
{
#ifdef WIN32
#endif
}
-unsigned Socket::do_write(const char *buf, unsigned size)
-{
- if(!connected)
- throw bad_socket_state("not connected");
-
- if(size==0)
- return 0;
-
- int ret = ::send(priv->handle, buf, size, 0);
- if(ret<0)
- {
- if(errno==EAGAIN)
- return 0;
- else
- throw system_error("send");
- }
-
- return ret;
-}
-
-unsigned Socket::do_read(char *buf, unsigned size)
-{
- if(!connected)
- throw bad_socket_state("not connected");
-
-
- if(size==0)
- return 0;
-
- int ret = ::recv(priv->handle, buf, size, 0);
- if(ret<0)
- {
- if(errno==EAGAIN)
- return 0;
- else
- throw system_error("recv");
- }
- else if(ret==0 && !eof_flag)
- {
- eof_flag = true;
- signal_end_of_file.emit();
- set_events(IO::P_NONE);
- }
-
- return ret;
-}
-
} // namespace Net
} // namespace Msp