/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community. If not, see .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
/
/**
* SOURCE: akgnet_socket.cc
*
* MODULE: akg network
* CLASS: Socket, ListenSocket, ServerSocket, ClientSocket
*
* COMMENTS:
*
*/
#include
#include
akg::Socket::Socket() throw()
{
}
bool akg::Socket::createTcpSocket() throw()
{
struct protoent *getprotoptr = getprotobyname("tcp");
fileDescriptor= socket(PF_INET,SOCK_STREAM,getprotoptr->p_proto);
if(fileDescriptor<0)
{ saveErrno();return false;}
return true;
}
akg::SocketAddress akg::Socket::getAddress() throw()
{
akgSocklen_t size = sizeof(sockaddr_in);
sockaddr_in buffer;
getsockname(fileDescriptor, (sockaddr*)&buffer,&size);
return SocketAddress(buffer);
}
akg::SocketAddress akg::Socket::getPeerAddress() throw()
{
akgSocklen_t size = sizeof(sockaddr_in);
sockaddr_in buffer;
int rasp=getpeername(fileDescriptor, (sockaddr*)&buffer,&size);
saveErrno();
return rasp != -1 ? SocketAddress(buffer) : SocketAddress();
}
//###########################################################
akg::ListenSocket::ListenSocket() throw()
{
queuesize = SOMAXCONN;
}
akg::ListenSocket::~ListenSocket() throw()
{
}
bool akg::ListenSocket::open(int port) throw()
{
close();
if(createTcpSocket() == false) return false;
struct sockaddr_in internetAddress;
internetAddress.sin_family = AF_INET;
internetAddress.sin_port = htons(port);
internetAddress.sin_addr.s_addr= htonl(INADDR_ANY);
#ifdef SO_REUSEADDR
int val = 1;
int len = sizeof( val );
if(setsockopt( fileDescriptor, SOL_SOCKET, SO_REUSEADDR, (char*)&val, len ))
{
DBTALK("Can't set address reusable: "< 0);
queuesize = newSize < SOMAXCONN ? newSize : SOMAXCONN;
}
int akg::ListenSocket::getQueueSize() throw()
{ return queuesize;
}
//###########################################################
akg::ServerSocket::ServerSocket() throw()
{
}
akg::ServerSocket::~ServerSocket() throw()
{
}
bool akg::ServerSocket::acceptFrom(ListenSocket& listenSocket) throw()
{
close();
struct sockaddr_in internetAddress;
akgSocklen_t size=sizeof(sockaddr_in);
savedErrno = 0;
fileDescriptor=accept(listenSocket(),(struct sockaddr*)&internetAddress,&size);
if(fileDescriptor < 0) { saveErrno();return false;}
return true;
}
//###########################################################
akg::ClientSocket::ClientSocket() throw()
{
}
akg::ClientSocket::~ClientSocket() throw()
{
}
bool akg::ClientSocket::open(const char *serverHost,int serverPort) throw()
{
close();
savedErrno=0;
if(createTcpSocket() == false) return false;
struct hostent *hostinfo=gethostbyname(serverHost);
if(hostinfo==NULL)
{ saveErrno();return false;
}
sockaddr_in internetAddress;
internetAddress.sin_family = AF_INET;
internetAddress.sin_port = htons(serverPort);
internetAddress.sin_addr = *(struct in_addr*)hostinfo->h_addr;
if(connect(fileDescriptor,(struct sockaddr*)&internetAddress,sizeof(sockaddr_in)) < 0)
{ saveErrno();return false;
}
return true;
}