-/* $Id$
-
-This file is part of libmspnet
-Copyright © 2008 Mikkosoft Productions, Mikko Rasa
-Distributed under the LGPL
-*/
-
#ifndef WIN32
#include <errno.h>
#include <fcntl.h>
#include <sys/socket.h>
#endif
#include <iostream>
-#include <msp/strings/formatter.h>
+#include <msp/io/handle_private.h>
+#include <msp/strings/format.h>
+#include <msp/time/rawtime_private.h>
#include <msp/time/units.h>
#include "socket.h"
WinSockHelper()
{
WSADATA wsa_data;
- int err=WSAStartup(0x0002, &wsa_data);
+ int err = WSAStartup(0x0002, &wsa_data);
if(err)
std::cerr<<"Failed to initialize WinSock: "<<err<<'\n';
}
local_addr(0),
peer_addr(paddr.copy())
{
- sockaddr sa;
- socklen_t size=sizeof(sockaddr);
- getsockname(handle, &sa, &size);
- local_addr=SockAddr::create(sa);
+ sockaddr_storage sa;
+ socklen_t size = sizeof(sockaddr_storage);
+ getsockname(handle, reinterpret_cast<sockaddr *>(&sa), &size);
+ local_addr = SockAddr::create(sa);
#ifdef WIN32
- event=CreateEvent(0, false, false, 0);
+ event = CreateEvent(0, false, false, 0);
+#else
+ *event = handle;
#endif
}
local_addr(0),
peer_addr(0)
{
- handle=socket(af, type, proto);
+ handle = socket(af, type, proto);
#ifdef WIN32
- event=CreateEvent(0, false, false, 0);
+ event = CreateEvent(0, false, false, 0);
+#else
+ *event = handle;
#endif
}
void Socket::set_block(bool b)
{
- mode=(mode&~IO::M_NONBLOCK);
+ mode = (mode&~IO::M_NONBLOCK);
if(b)
- mode=(mode|IO::M_NONBLOCK);
+ mode = (mode|IO::M_NONBLOCK);
#ifdef WIN32
- u_long flag=!b;
+ u_long flag = !b;
ioctlsocket(handle, FIONBIO, &flag);
#else
- int flags=fcntl(handle, F_GETFL);
+ int flags = fcntl(handle, F_GETFL);
fcntl(handle, F_SETFL, (flags&O_NONBLOCK)|(b?0:O_NONBLOCK));
#endif
}
-IO::Handle Socket::get_event_handle()
+const IO::Handle &Socket::get_event_handle()
{
-#ifdef WIN32
return event;
-#else
- return handle;
-#endif
}
{
check_state(false);
- sockaddr sa;
- unsigned size=addr.fill_sockaddr(sa);
+ sockaddr_storage sa;
+ unsigned size = addr.fill_sockaddr(sa);
- int err=::bind(handle, &sa, size);
+ int err = ::bind(handle, reinterpret_cast<sockaddr *>(&sa), size);
if(err==-1)
throw SystemError("Unable to bind", errno);
delete local_addr;
- local_addr=addr.copy();
+ local_addr = addr.copy();
}
-/**
-Closes the socket. Most operations on the socket will throw an exception after
-this.
-*/
void Socket::close()
{
if(handle==MSP_NET_INVALID_SOCKET_HANDLE)
#else
::close(handle);
#endif
- handle=MSP_NET_INVALID_SOCKET_HANDLE;
- connected=false;
+ handle = MSP_NET_INVALID_SOCKET_HANDLE;
+ connected = false;
signal_closed.emit();
delete local_addr;
- local_addr=0;
+ local_addr = 0;
delete peer_addr;
- peer_addr=0;
+ peer_addr = 0;
}
void Socket::set_timeout(const Time::TimeDelta &timeout)
{
#ifndef WIN32
- timeval tv;
- timeout.fill_timeval(tv);
+ timeval tv = Time::rawtime_to_timeval(timeout.raw());
set_option(SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(timeval));
set_option(SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(timeval));
#else
if(size==0)
return 0;
- int ret=::send(handle, buf, size, 0);
+ int ret = ::send(handle, buf, size, 0);
if(ret<0)
{
if(errno==EAGAIN)
if(size==0)
return 0;
- int ret=::recv(handle, buf, size, 0);
+ int ret = ::recv(handle, buf, size, 0);
if(ret<0)
{
if(errno==EAGAIN)
}
else if(ret==0 && !eof_flag)
{
- eof_flag=true;
+ eof_flag = true;
signal_end_of_file.emit();
set_events(IO::P_NONE);
}