Written by Udhaya Kumar.V 
20 - April - 2001
http://www.udhaya.com
Conduct Id : [email protected]

Slave Proxy Server ( Source Code in SCO Unix )


 ProxyServer.cpp 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define		USER_IP_LIST				"/pserver/ip.dat"
#define		USER_ERROR				"/pserver/error.html"
#define		BUFSIZE					1024

class TCPServer
{
	private:
		struct sockaddr_in			ServerAddress;
		struct sockaddr_in			ClientAddress;
		struct sockaddr_in			ProxyAddress;
		int 					ServerSocket;
		int 					ProxySock;
		int					Client;
		int					ProxyHandle;
		int					BrowserHandle;
		int 					MaxFdp;
		int 					NFound;
		int 					NRead;
		char 					Data[ BUFSIZE ];
		char					ErrorData[ 2048 ];
		fd_set					ReadMask;
		struct timeval 				TimeDelay;

		struct Handle
		{
			int				BHandle;
			int				PHandle;
			struct Handle			*HNext;
		}*HStart, *HLast, *HCur, *HPrev;

		struct IpAddress
		{
			char				Ip[ 15 ];
			struct IpAddress		*INext;
		} *IStart, *ILast, *ICur;
	
	public:

		TCPServer( char Address[ 15 ],int PortNo );
		~TCPServer () {}
		int					CreateServer( void );
		int					ServerListen ( int BackLog );
		int					ServerAccept ( void );
		void					DataHandle ( void );
		void					AddHandle ( int Bh, int Ph );
		void					DeleteHandle ( int Bh, int Ph );
		void					DisplayHandle ( void );
		void					GetIp ( void );
		int					ExistIp ( char	Ip[ 15 ] );
		void					GetErrorMessage ( void );
};

TCPServer :: TCPServer( char Address[ 15 ], int PortNo )
{
		HStart = HLast = NULL;
		IStart = ILast = NULL;
		ServerAddress.sin_family = AF_INET;
		ServerAddress.sin_port = htons ( PortNo );
		ServerAddress.sin_addr.s_addr = inet_addr ( Address );
		bzero ( &ServerAddress.sin_zero, 8 );

		ProxyAddress.sin_family = AF_INET;
		ProxyAddress.sin_port = htons ( 81 );
		ProxyAddress.sin_addr.s_addr = INADDR_ANY; 
		bzero ( &ProxyAddress.sin_zero, 8 );

		TimeDelay.tv_sec = 0;
		TimeDelay.tv_usec = 1;
}

int TCPServer :: CreateServer( void )
{
		GetIp ();
		GetErrorMessage ();
		if ( ( ServerSocket = socket ( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
		{
			perror ( "Socket Error." );
			exit ( 0 );
		}
		else
		{
			if ( bind ( ServerSocket, (struct sockaddr * ) &ServerAddress,16 )<0 )
			{
				perror ( "Bind Error." );
				exit ( 0 );
			}
			else
				printf ( "Proxy Server Started(Bind).\n" );
		}
		return ( ServerSocket );
}

int TCPServer :: ServerListen ( int BackLog )
{
		int Ret;
		if ( ( Ret = listen ( ServerSocket, BackLog ) ) < 0 )
		{
			perror ( "Listen Error:" );
			exit ( 0 );
		}
		else
			printf ( "(Listen).\n" );
		return ( Ret );
}

int TCPServer :: ServerAccept ( void )
{
	if ( ( BrowserHandle = accept ( ServerSocket , (struct sockaddr *) &ClientAddress, &Client ) ) < 0 )
	{
		perror ( "Browser connection error:" );
		exit ( 0 );
	}
	else
	{
		if ( ( ProxyHandle = socket ( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
		{
			printf ( "Socket Error.\n" );
			exit ( 0 );
		}
		if ( connect ( ProxyHandle, ( struct sockaddr * ) &ProxyAddress, sizeof(ProxyAddress) ) < 0 )
		{
			perror ( "Proxy Connection Error:" );
			exit (2);
		}
		else
		{
			AddHandle ( BrowserHandle, ProxyHandle );
		}
	}
	return ( BrowserHandle );
}

void TCPServer :: AddHandle ( int Bh, int Ph )
{
	HCur = ( struct Handle * ) malloc ( sizeof ( struct Handle ) );
	HCur->BHandle = Bh;
	HCur->PHandle = Ph;

	if ( HStart == NULL )
		HStart = HCur;
	else
		HLast->HNext = HCur;
	HLast = HCur;
	HCur->HNext = NULL;
}

void TCPServer :: DeleteHandle ( int Bh, int Ph )
{
	struct Handle *Temp;
	for ( HCur = HStart; HCur; HPrev = HCur, HCur = HCur->HNext )
	{
		if ( HCur->BHandle == Bh && HCur->PHandle == Ph )
		{
			Temp = HCur;
			if ( HCur == HStart )
			{
				HStart = Temp->HNext;
			}
			else if ( HCur->HNext == NULL )
			{
				HPrev->HNext = NULL;
				HLast = HPrev;
			}
			else
			{
				HPrev->HNext = HCur->HNext;
			}
			free ( Temp );
		}
	}
}

void TCPServer :: DisplayHandle ( void )
{
	for ( HCur = HStart; HCur; HCur=HCur->HNext )
		printf ( "BHandle: %d  PHandle: %d\n", HCur->BHandle, HCur->PHandle );
}

void TCPServer :: GetIp ( void )
{
	FILE		*Fp;
	char		ip[ 15 ];

	Fp = fopen ( USER_IP_LIST, "r" );
	if ( Fp == NULL )
	{
		printf ( "%s File Not Found \n", USER_IP_LIST );
		printf ( "Please enter the browser ip address information" );
		exit ( 0 );
	}
	else
	{
		while ( 1 )
		{
			fscanf ( Fp, "%s", ip );
			printf ( "\nAccess Ip: %s", ip );
			ICur = ( struct IpAddress * ) malloc ( sizeof ( struct IpAddress ) );
			strcpy ( ICur->Ip, ip );
			if ( IStart == NULL )
				IStart = ICur;
			else
				ILast->INext = ICur;

			ILast = ICur;
			ICur->INext = NULL;

			if ( feof ( Fp ) )
				break;
		}
	}
	fclose ( Fp );
}

int TCPServer :: ExistIp ( char	Ip[ 15 ] )
{
	for ( ICur = IStart; ICur; ICur=ICur->INext )
		if ( strcmp ( ICur->Ip, Ip ) == 0 )
			return ( 1 );
	return ( 0 );
}

void TCPServer :: GetErrorMessage ( void )
{
	FILE		*Fp;
	char		Dat[ BUFSIZE ];

	Fp = fopen ( USER_ERROR, "r" );
	if ( Fp == NULL )
	{
		printf ( "Please create error file( %s ) \n", USER_ERROR );
		printf ( "After U can start Proxy Server\n" );
		exit ( 0 );
	}
	else
	{
		while ( !feof ( Fp ) )
		{
			fgets ( Dat, '\n', Fp );
			strcat ( ErrorData, Dat );
		}
	}
	fclose ( Fp );
}

void TCPServer :: DataHandle ( void )
{
	while ( 1 )
	{
		FD_ZERO ( &ReadMask );
		FD_SET ( ServerSocket, &ReadMask );
		for ( HCur = HStart; HCur; HCur = HCur->HNext )
		{
			FD_SET ( HCur->BHandle, &ReadMask );
			FD_SET ( HCur->PHandle, &ReadMask );
			MaxFdp = HCur->PHandle;
		}
		MaxFdp++ ; 

		NFound = select ( MaxFdp, &ReadMask, ( fd_set *) 0, ( fd_set * ) 0, ( struct timeval * ) &TimeDelay );

		if ( NFound < 0 )
		{
			perror ( "Select Error:" );
		}

		if ( FD_ISSET ( ServerSocket, &ReadMask ) )
		{
			if ( ( BrowserHandle = accept ( ServerSocket , (struct sockaddr *) &ClientAddress, &Client ) ) < 0 )
				perror ( "Browser connection error:" );
			else
			{
				int d = sizeof ( ClientAddress ); 
				getpeername ( BrowserHandle, (struct sockaddr * )&ClientAddress, &d ); 
				if ( ExistIp ( inet_ntoa ( ClientAddress.sin_addr ) ) == 1 )
				{
				if ( ( ProxyHandle = socket ( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
					printf ( "Socket Error.\n" );
				if ( connect ( ProxyHandle, ( struct sockaddr * ) &ProxyAddress, sizeof(ProxyAddress) ) < 0 )
				{
							perror ( "Proxy Connection Error:" );
					exit (2);
				}
				else
				{
					AddHandle ( BrowserHandle, ProxyHandle );
				}
				}
				else
				{
					sprintf ( Data, "HTTP/1.0 302 Found\nContent-type: text/html\nContent-length: %d\n\n", strlen ( ErrorData ) );
					write ( BrowserHandle, &Data, strlen ( Data ) );
					write ( BrowserHandle, &ErrorData, strlen ( ErrorData ) );
					strcpy ( Data, "\n\n" );
					write ( BrowserHandle, &Data, strlen ( Data ) );
				}
			}
		}

		for ( HCur = HStart; HCur; HCur = HCur->HNext )
		{
			if ( FD_ISSET ( HCur->BHandle, &ReadMask ) )
			{
				NRead = read ( HCur->BHandle, &Data, sizeof ( Data ) );
				if ( NRead <= 0 )
				{
					close ( HCur->BHandle );
					close ( HCur->PHandle );
					DeleteHandle ( HCur->BHandle, HCur->PHandle );
					break;
				}
				if ( write ( HCur->PHandle, &Data, NRead ) != NRead )
					printf ( "\nError:- Write Error to Stream pipe" );
			}
		}

		for ( HCur = HStart; HCur; HCur = HCur->HNext )
		{
			if ( FD_ISSET ( HCur->PHandle, &ReadMask ) )
			{
				NRead = read ( HCur->PHandle, &Data, sizeof ( Data ) );
				if ( NRead <= 0 )
				{
					close ( HCur->BHandle );
					close ( HCur->PHandle );
					DeleteHandle ( HCur->BHandle, HCur->PHandle );
					break;
				}
				if ( write ( HCur->BHandle, &Data, NRead ) != NRead )
					printf ( "\nWrite error in stdout" );
			}
		}
	}
}


main ()
{
	TCPServer *Server = new TCPServer ( "140.0.0.178", 80 );
	Server->CreateServer ();
	Server->ServerListen( 20 );
	Server->DataHandle ();
}



 /pserver/ip.dat 

140.0.0.70
140.0.0.71
140.0.0.72
140.0.0.73
140.0.0.76
140.0.0.77
140.0.0.80
140.0.0.50
140.0.0.30

 /pserver/error.html 

Sorry, U don't have permission to access this Proxy Server.




Any suggestions or problems regarding this web site should be directed to [email protected]
Copyright © 2001-2003 V.Udhaya Kumar . All rights reserved. Last updated 02-04-20001
Hosted by www.Geocities.ws

1