/* $Id$
This file is part of libmspnet
-Copyright © 2008 Mikkosoft Productions, Mikko Rasa
+Copyright © 2008-2009, 2011 Mikkosoft Productions, Mikko Rasa
Distributed under the LGPL
*/
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)
+{
+#ifdef WIN32
+ WSAEventSelect(handle, event, FD_READ|FD_CLOSE);
+#endif
+ set_events(IO::P_INPUT);
+}
+
/**
Constructs a new StreamSocket.
*/
if(connected)
throw InvalidState("Socket is already connected");
- 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();
if(err_code==WSAEWOULDBLOCK)
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)
peer_addr=addr.copy();
delete local_addr;
- size=sizeof(sockaddr);
- getsockname(handle, &sa, &size);
+ size=sizeof(sockaddr_storage);
+ getsockname(handle, reinterpret_cast<sockaddr *>(&sa), &size);
local_addr=SockAddr::create(sa);
if(err==0)
{
connected=true;
+ set_events(IO::P_INPUT);
signal_connect_finished.emit(0);
}
return (err==0)?0:1;
}
-/**
-Used by StreamListenSocket to construct a new socket from accept.
-*/
-StreamSocket::StreamSocket(SocketHandle h, const SockAddr &paddr):
- Socket(h, paddr),
- connecting(false)
-{
-#ifdef WIN32
- WSAEventSelect(handle, event, FD_READ|FD_CLOSE);
-#endif
- set_events(IO::P_INPUT);
-}
-
void StreamSocket::on_event(IO::PollEvent ev)
{
//cout<<"StreamSocket::on_event "<<ev<<'\n';