Files
cdev-1.7.2n/extensions/cdevGenericServer/lib/cdevSocket.cc
2022-12-13 12:44:04 +01:00

158 lines
2.6 KiB
C++

#include "cdevSocket.h"
void cdevSocket::setHandle ( int fd )
{
handle = fd;
}
int cdevSocket::getHandle ( void ) const
{
return handle;
}
int cdevSocket::open (int type, int protocol_family, int protocol)
{
setHandle(::socket(protocol_family, type, protocol));
return getHandle();
}
int cdevSocket::close (void)
{
int result = ::close(getHandle());
setHandle(INVALID_HANDLE);
return result;
}
int cdevSocket::unsetFlags ( int flags )
{
int retval = -1;
int fd = getHandle();
if(fd!=cdevSocket::INVALID_HANDLE)
{
#ifdef WIN32
if(flags==O_NONBLOCK)
{
unsigned long val = 0;
retval = ::ioctlsocket(fd, FIONBIO, &val);
}
#else
int val;
if((val=::fcntl(fd, F_GETFL, 0)) != -1)
{
val &= ~flags;
retval = (::fcntl(fd, F_SETFL, val)!=-1)?0:1;
}
#endif
}
return retval;
}
int cdevSocket::setFlags ( int flags )
{
int retval = -1;
int fd = getHandle();
if(fd!=cdevSocket::INVALID_HANDLE)
{
#ifdef WIN32
if(flags==O_NONBLOCK)
{
unsigned long val = 1;
retval = ::ioctlsocket(fd, FIONBIO, &val);
}
#else
int val;
if ((val=::fcntl(fd, F_GETFL, 0)) != -1)
{
val |= flags;
if(::fcntl(fd, F_SETFL, val) != -1) retval = 0;
}
#endif
}
return retval;
}
int cdevSocket::getFlags ( void )
{
int retval = -1;
int fd = getHandle();
#ifdef WIN32
retval = 0;
#else
if(fd!=cdevSocket::INVALID_HANDLE)
{
retval=::fcntl(fd, F_GETFL, 0);
}
#endif
return retval;
}
int cdevSocket::setOption (int level, int option, void *optval, int optlen) const
{
return ::setsockopt(getHandle(), level, option, (char *)optval, (SOCKOPT_SIZE_PARM)optlen);
}
int cdevSocket::getOption (int level, int option, void *optval, int *optlen) const
{
return ::getsockopt(getHandle(), level, option, (char *)optval, (SOCKOPT_SIZE_PARM *)optlen);
}
int cdevSocket::getLocalAddress (cdevAddr & addr)
{
int retval;
int len=addr.getSize();
if(::getsockname(getHandle(), (sockaddr *)addr.getAddress(), (SOCKOPT_SIZE_PARM *)&len)==INVALID_HANDLE)
{
retval = INVALID_HANDLE;
}
else {
addr.setSize(len);
retval = 0;
}
return retval;
}
int cdevSocket::getRemoteAddress (cdevAddr & addr)
{
int retval;
int len = addr.getSize();
if(::getpeername(getHandle(), (sockaddr *)addr.getAddress(), (SOCKOPT_SIZE_PARM *)&len)==INVALID_HANDLE)
{
retval = INVALID_HANDLE;
}
else {
addr.setSize(len);
retval = 0;
}
return retval;
}
cdevSocket::cdevSocket ( void )
: handle(INVALID_HANDLE)
{
}
cdevSocket::cdevSocket(int type, int protocol_family, int protocol)
: handle(INVALID_HANDLE)
{
setHandle(open(type, protocol_family, protocol));
}