-/* $Id$
-
-This file is part of libmspnet
-Copyright © 2008 Mikkosoft Productions, Mikko Rasa
-Distributed under the LGPL
-*/
-
#ifndef WIN32
#include <sys/socket.h>
#endif
#include <cerrno>
#include <msp/io/poll.h>
-#include <msp/strings/formatter.h>
+#include <msp/strings/format.h>
#include "streamsocket.h"
namespace Msp {
namespace Net {
-/**
-Used by StreamListenSocket to construct a new socket from accept.
-*/
StreamSocket::StreamSocket(SocketHandle h, const SockAddr &paddr):
Socket(h, paddr),
connecting(false)
set_events(IO::P_INPUT);
}
-/**
-Constructs a new StreamSocket.
-*/
StreamSocket::StreamSocket(Family af, int proto):
Socket(af, SOCK_STREAM, proto),
connecting(false)
{ }
-/**
-Checks the status of an ongoing connection attempt. If the connection fails
-with an error, an exception is thrown.
-
-@return 0 if the connection finished, 1 if not
-*/
int StreamSocket::poll_connect(const Time::TimeDelta &timeout)
{
check_state(false);
if(!connecting)
throw InvalidState("No connection attempt going on");
- int res=poll(*this, IO::P_OUTPUT, timeout);
+ int res = poll(*this, IO::P_OUTPUT, timeout);
if(res==-1)
#ifdef WIN32
throw Exception(format("Connection polling failed: %d", WSAGetLastError()));
#endif
else if(res>0)
{
- connecting=false;
+ connecting = false;
int err;
- socklen_t len=sizeof(int);
+ socklen_t len = sizeof(int);
get_option(SOL_SOCKET, SO_ERROR, &err, &len);
if(err!=0)
#endif
set_events(IO::P_INPUT);
- connected=true;
+ connected = true;
return 0;
}
return 1;
}
-/**
-Connects the socket to a remote address. In non-blocking mode, this function
-may return before the connection is finished. The caller must then use either
-the poll_connect function or an EventDispatcher to determine when the
-connection is finished.
-
-@return 0 if the connection finished, 1 if it is in progress
-*/
int StreamSocket::connect(const SockAddr &addr)
{
check_state(false);
if(connected)
throw InvalidState("Socket is already connected");
- sockaddr sa;
- socklen_t size=addr.fill_sockaddr(sa);
+ sockaddr_storage sa;
+ socklen_t size = addr.fill_sockaddr(sa);
#ifdef WIN32
- int err=WSAConnect(handle, &sa, size, 0, 0, 0, 0);
- if(err=SOCKET_ERROR)
+ int err = WSAConnect(handle, reinterpret_cast<sockaddr *>(&sa), size, 0, 0, 0, 0);
+ if(err==SOCKET_ERROR)
{
- int err_code=WSAGetLastError();
+ int err_code = WSAGetLastError();
if(err_code==WSAEWOULDBLOCK)
{
- connecting=true;
+ connecting = true;
WSAEventSelect(handle, event, FD_CONNECT);
set_events(IO::P_OUTPUT);
}
throw Exception(format("Unable to connect: %d", err_code));
}
#else
- int err=::connect(handle, &sa, size);
+ int err = ::connect(handle, reinterpret_cast<sockaddr *>(&sa), size);
if(err==-1)
{
if(errno==EINPROGRESS)
{
- connecting=true;
+ connecting = true;
set_events(IO::P_OUTPUT);
}
else
#endif
delete peer_addr;
- peer_addr=addr.copy();
+ peer_addr = addr.copy();
delete local_addr;
- size=sizeof(sockaddr);
- getsockname(handle, &sa, &size);
- local_addr=SockAddr::create(sa);
+ size = sizeof(sockaddr_storage);
+ getsockname(handle, reinterpret_cast<sockaddr *>(&sa), &size);
+ local_addr = SockAddr::create(sa);
if(err==0)
{
- connected=true;
+ connected = true;
+ set_events(IO::P_INPUT);
signal_connect_finished.emit(0);
}
void StreamSocket::on_event(IO::PollEvent ev)
{
- //cout<<"StreamSocket::on_event "<<ev<<'\n';
if((ev&(IO::P_OUTPUT|IO::P_ERROR)) && connecting)
{
int err;
- socklen_t len=sizeof(err);
+ socklen_t len = sizeof(err);
get_option(SOL_SOCKET, SO_ERROR, &err, &len);
- connecting=false;
- connected=(err==0);
+ connecting = false;
+ connected = (err==0);
signal_connect_finished.emit(err);
if(err!=0)
{
delete peer_addr;
- peer_addr=0;
+ peer_addr = 0;
}
#ifdef WIN32