Source Code (Use browser search to find items of interest.)
Class Index
kdelibs'KServerSocket (./kdelibs/kdecore/ksock.h:216)
class KServerSocket : public QObject
{
Q_OBJECT
public:
/**
* Constructor.
* @param _port the port number to monitor for incoming connections.
*/
KServerSocket( unsigned short int _port );
/**
* Creates a UNIX domain server socket.
*/
KServerSocket( const char *_path );
/**
* Destructor. Closes the socket if it was not already closed.
*/
~KServerSocket();
/**
* Get the file descriptor assoziated with the socket.
*/
int socket() const { return sock; }
/**
* Returns the port number which is being monitored.
*/
unsigned short int port();
/**
* The address.
*/
unsigned long ipv4_addr();
public slots:
/**
* Called when someone connected to our port.
*/
virtual void slotAccept( int );
signals:
/**
* A connection has been accepted.
* It is your task to delete the KSocket if it is no longer needed.
*/
void accepted( KSocket* );
protected:
bool init( short unsigned int );
bool init( const char *_path );
/**
* Notifies us when there is something to read on the port.
*/
QSocketNotifier *notifier;
/**
* The file descriptor for this socket. sock may be -1.
* This indicates that it is not connected.
*/
int sock;
int domain;
private:
KServerSocket(const KServerSocket&);
KServerSocket& operator=(const KServerSocket&);
KServerSocketPrivate *d;
};
// Here are a whole bunch of hackish macros that allow one to
// get at the correct member of ksockaddr_in
kdelibs'KServerSocket::KServerSocket() (./kdelibs/kdecore/ksock.cpp:369)
KServerSocket::KServerSocket( const char *_path ) :
notifier( 0L ), sock( -1 )
{
domain = PF_UNIX;
if ( !init ( _path ) )
{
fatal("Error constructing PF_UNIX domain server socket\n");
return;
}
notifier = new QSocketNotifier( sock, QSocketNotifier::Read );
connect( notifier, SIGNAL( activated(int) ), this, SLOT( slotAccept(int) ) );
}
kdelibs'KServerSocket::KServerSocket() (./kdelibs/kdecore/ksock.cpp:384)
KServerSocket::KServerSocket( unsigned short int _port ) :
notifier( 0L ), sock( -1 )
{
domain = PF_INET;
if ( !init ( _port ) )
{
// fatal("Error constructing\n");
return;
}
notifier = new QSocketNotifier( sock, QSocketNotifier::Read );
connect( notifier, SIGNAL( activated(int) ), this, SLOT( slotAccept(int) ) );
}
kdelibs'KServerSocket::init() (./kdelibs/kdecore/ksock.cpp:399)
bool KServerSocket::init( const char *_path )
{
if ( domain != PF_UNIX )
return false;
int l = strlen( _path );
if ( l > UNIX_PATH_MAX - 1 )
{
warning( "Too long PF_UNIX domain name '%s'\n",_path);
return false;
}
sock = ::socket( PF_UNIX, SOCK_STREAM, 0 );
if (sock < 0)
{
warning( "Could not create socket\n");
return false;
}
unlink(_path );
struct sockaddr_un name;
name.sun_family = AF_UNIX;
strcpy( name.sun_path, _path );
if ( bind( sock, (struct sockaddr*) &name,sizeof( name ) ) < 0 )
{
warning("Could not bind to socket\n");
::close( sock );
sock = -1;
return false;
}
if ( chmod( _path, 0600) < 0 )
{
warning("Could not setupt premissions for server socket\n");
::close( sock );
sock = -1;
return false;
}
if ( listen( sock, SOMAXCONN ) < 0 )
{
warning("Error listening on socket\n");
::close( sock );
sock = -1;
return false;
}
return true;
}
kdelibs'KServerSocket::init() (./kdelibs/kdecore/ksock.cpp:451)
bool KServerSocket::init( unsigned short int _port )
{
if (
#ifdef INET6
( domain != PF_INET6 ) &&
#endif
( domain != PF_INET ) )
return false;
sock = ::socket( domain, SOCK_STREAM, 0 );
if (sock < 0)
{
warning( "Could not create socket\n");
return false;
}
if (domain == AF_INET) {
sockaddr_in name;
name.sin_family = domain;
name.sin_port = htons( _port );
name.sin_addr.s_addr = htonl(INADDR_ANY);
if ( bind( sock, (struct sockaddr*) &name,sizeof( name ) ) < 0 ) {
warning("Could not bind to socket\n");
::close( sock );
sock = -1;
return false;
}
}
#ifdef INET6
else if (domain == AF_INET6) {
sockaddr_in6 name;
name.sin6_family = domain;
name.sin6_flowinfo = 0;
name.sin6_port = htons(_port);
memcpy(&name.sin6_addr, &in6addr_any, sizeof(in6addr_any));
if ( bind( sock, (struct sockaddr*) &name,sizeof( name ) ) < 0 ) {
warning("Could not bind to socket\n");
::close( sock );
sock = -1;
return false;
}
}
#endif
if ( listen( sock, SOMAXCONN ) < 0 )
{
warning("Error listening on socket\n");
::close( sock );
sock = -1;
return false;
}
return true;
}
kdelibs'KServerSocket::port() (./kdelibs/kdecore/ksock.cpp:511)
unsigned short int KServerSocket::port()
{
if ( domain != PF_INET )
return false;
ksockaddr_in name; ksize_t len = sizeof(name);
getsockname(sock, (struct sockaddr *) &name, &len);
return ntohs(get_sin_port(name));
}
kdelibs'KServerSocket::ipv4_addr() (./kdelibs/kdecore/ksock.cpp:521)
unsigned long KServerSocket::ipv4_addr()
{
if ( domain != PF_INET )
return 0;
sockaddr_in name; ksize_t len = sizeof(name);
getsockname(sock, (struct sockaddr *) &name, &len);
if (name.sin_family == AF_INET) // It's IPv4
return ntohl(name.sin_addr.s_addr);
#ifdef INET6
else if (name.sin_family == AF_INET6) // It's IPv6 Ah.
return 0;
#endif
else // We dunno what it is
return 0;
}
kdelibs'KServerSocket::slotAccept() (./kdelibs/kdecore/ksock.cpp:538)
void KServerSocket::slotAccept( int )
{
if ( domain == PF_INET )
{
ksockaddr_in clientname;
int new_sock;
ksize_t size = sizeof(clientname);
if ((new_sock = accept (sock, (struct sockaddr *) &clientname, &size)) < 0)
{
warning("Error accepting\n");
return;
}
emit accepted( new KSocket( new_sock ) );
}
else if ( domain == PF_UNIX )
{
struct sockaddr_un clientname;
int new_sock;
ksize_t size = sizeof(clientname);
if ((new_sock = accept (sock, (struct sockaddr *) &clientname, &size)) < 0)
{
warning("Error accepting\n");
return;
}
emit accepted( new KSocket( new_sock ) );
}
}
kdelibs'KServerSocket::~KServerSocket() (./kdelibs/kdecore/ksock.cpp:572)
KServerSocket::~KServerSocket()
{
if ( notifier )
delete notifier;
close( sock );
}