66 lines
1.5 KiB
C++
66 lines
1.5 KiB
C++
#include "cdevSocketConnector.h"
|
|
#include "cdevHandleSet.h"
|
|
|
|
// *****************************************************************************
|
|
// * cdevSocketConnector::connect :
|
|
// * Actively connect and produce a new cdevSocketStream if things go well...
|
|
// *****************************************************************************
|
|
int cdevSocketConnector::connect ( const cdevAddr & remote_addr )
|
|
{
|
|
int retval = 0;
|
|
|
|
if(getHandle() == cdevSocket::INVALID_HANDLE &&
|
|
cdevSocket::open(SOCK_STREAM, PF_INET, 0) == cdevSocket::INVALID_HANDLE)
|
|
{
|
|
retval = -1;
|
|
}
|
|
else
|
|
{
|
|
double secondsWaited = 0.0;
|
|
sockaddr *addr=(sockaddr *) remote_addr.getAddress();
|
|
size_t size=remote_addr.getSize();
|
|
|
|
if(configureHandle()<0)
|
|
{
|
|
retval = -1;
|
|
}
|
|
else if(::connect(getHandle(), addr, size) == cdevSocket::INVALID_HANDLE)
|
|
{
|
|
int errCode = GetSocketErrno();
|
|
|
|
if(getBlockingSemantics()==O_NONBLOCK && errCode==EINPROGRESS)
|
|
{
|
|
errCode=EWOULDBLOCK;
|
|
}
|
|
|
|
if(errCode == EISCONN)
|
|
{
|
|
retval = 0;
|
|
}
|
|
else if(errCode != EWOULDBLOCK)
|
|
{
|
|
close();
|
|
setHandle(cdevSocket::INVALID_HANDLE);
|
|
retval = -1;
|
|
}
|
|
else {
|
|
cdevHandleSet ws;
|
|
cdevHandleSet es;
|
|
struct timeval tv;
|
|
int fd = getHandle();
|
|
|
|
ws.set_bit(fd);
|
|
es.set_bit(fd);
|
|
tv.tv_sec = 3;
|
|
tv.tv_usec = 0;
|
|
|
|
if(cdevSelect(fd+1, NULL, ws, es, &tv)>0 && ws.is_set(fd)) retval = 0;
|
|
else retval = -1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|