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.