You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.1 KiB
147 lines
4.1 KiB
//
|
|
// Connection.h
|
|
//
|
|
// Connection: This class forms a easy to use interface to the berkeley
|
|
// tcp socket library. All the calls are basically the same,
|
|
// but the parameters do not have any stray _addr or _in
|
|
// mixed in...
|
|
//
|
|
// Part of the ht://Dig package <http://www.htdig.org/>
|
|
// Copyright (c) 1995-2004 The ht://Dig Group
|
|
// For copyright details, see the file COPYING in your distribution
|
|
// or the GNU Library General Public License (LGPL) version 2 or later
|
|
// <http://www.gnu.org/copyleft/lgpl.html>
|
|
//
|
|
// $Id: Connection.h,v 1.10 2004/05/28 13:15:22 lha Exp $
|
|
//
|
|
|
|
#ifndef _Connection_h_
|
|
#define _Connection_h_
|
|
|
|
#include "Object.h"
|
|
#include "htString.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <sys/types.h>
|
|
|
|
#ifdef _MSC_VER /* _WIN32 */
|
|
#include <winsock.h>
|
|
#else
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <netdb.h>
|
|
#endif
|
|
|
|
class Connection : public Object
|
|
{
|
|
public:
|
|
// Constructors & Destructors
|
|
Connection(int socket = -1); // Default constructor
|
|
Connection(const Connection& rhs); // Copy constructor
|
|
~Connection();
|
|
|
|
// (De)initialization
|
|
int Win32Socket_Init(void);
|
|
int Open(int priv = 0);
|
|
virtual int Close();
|
|
int Ndelay();
|
|
int Nondelay();
|
|
int Timeout(int value);
|
|
int Retries(int value);
|
|
int WaitTime(unsigned int _wt);
|
|
|
|
// Port stuff
|
|
int Assign_Port(int port = 0);
|
|
int Assign_Port(const String& service);
|
|
int Get_Port();
|
|
inline int Is_Privileged();
|
|
|
|
// Host stuff
|
|
int Assign_Server(const String& name);
|
|
int Assign_Server(unsigned int addr = INADDR_ANY);
|
|
const String &Get_Server() const { return server_name; }
|
|
const String &Get_Server_IPAddress() const { return server_ip_address; }
|
|
|
|
// Connection establishment
|
|
virtual int Connect();
|
|
Connection *Accept(int priv = 0);
|
|
Connection *Accept_Privileged();
|
|
|
|
// Registration things
|
|
int Bind();
|
|
int Listen(int n = 5);
|
|
|
|
// IO
|
|
String* Read_Line(String &, char *terminator = (char *)"\n");
|
|
char* Read_Line(char *buffer, int maxlength, char *terminator=(char *)"\n");
|
|
String* Read_Line(char *terminator = (char *)"\n");
|
|
virtual int Read_Char();
|
|
int Write_Line(char *buffer, char *eol = (char *)"\n");
|
|
|
|
int Write(char *buffer, int maxlength = -1);
|
|
int Read(char *buffer, int maxlength);
|
|
|
|
virtual int Read_Partial(char *buffer, int maxlength);
|
|
virtual int Write_Partial(char *buffer, int maxlength);
|
|
void Stop_IO() {need_io_stop = 1;}
|
|
|
|
// Access to socket number
|
|
char *Socket_as_String();
|
|
int Get_Socket() { return sock; }
|
|
int IsOpen() { return sock >= 0; }
|
|
int IsConnected() { return connected; }
|
|
|
|
// Access to info about remote socket
|
|
const char* Get_PeerIP() const;
|
|
const char* Get_Peername();
|
|
|
|
// A method to re-initialize the buffer
|
|
virtual void Flush();
|
|
|
|
private:
|
|
//
|
|
// For buffered IO we will need a buffer
|
|
//
|
|
enum {BUFFER_SIZE = 8192};
|
|
char buffer[BUFFER_SIZE];
|
|
int pos, pos_max;
|
|
// Assignment operator declared private for preventing any use
|
|
Connection& operator+ (const Connection& rhs) { return *this; }
|
|
|
|
protected:
|
|
int sock;
|
|
struct sockaddr_in server;
|
|
int connected;
|
|
String peer;
|
|
String server_name;
|
|
String server_ip_address;
|
|
int need_io_stop;
|
|
int timeout_value;
|
|
int retry_value;
|
|
unsigned int wait_time; // time to wait after an
|
|
// unsuccessful connection
|
|
};
|
|
|
|
|
|
//*************************************************************************
|
|
// inline int Connection::Is_Privileged()
|
|
// PURPOSE:
|
|
// Return whether the port is priveleged or not.
|
|
//
|
|
inline int Connection::Is_Privileged()
|
|
{
|
|
return server.sin_port < 1023;
|
|
}
|
|
|
|
|
|
//
|
|
// Get arround the lack of gethostip() library call... There is a gethostname()
|
|
// call but we want the IP address, not the name!
|
|
// The call will put the ASCII string representing the IP address in the supplied
|
|
// buffer and it will also return the 4 byte unsigned long equivalent of it.
|
|
// The ip buffer can be null...
|
|
//
|
|
unsigned int gethostip(char *ip = 0, int length = 0);
|
|
|
|
#endif
|