📄 proxy.c
字号:
/* Linux PROXY
* (c)Copyright Hu Qiwei, Tsinghua Univ.
* 1996, Beijing, P.R.China.
* for free distributing
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>
#include <sys/file.h>
#include <signal.h>
#include <sys/socket.h>
char buf[1024];
char rbuf[1024];
int count = 1;
char *nimsg = "This function has not been implemented yet!\n";
char *errmsg = "Error : unknown command!\n";
char *rfmsg = "Proxy error: remote link failure.\n";
char *unmsg = "Proxy error: unknown remote host.\n";
char *cnmsg = "Proxy error: connection failure.\n";
char *wrmsg = "Proxy error: can't send request.\n";
int data = 0;
int code;
struct sockaddr_in data_addr;
struct sockaddr_in myctladdr;
int sendport = -1;
int initconn( int s )
{
register char *p, *a;
int result, len, tmpno = 0;
int on = 1;
len = sizeof (myctladdr);
if (getsockname(s, (struct sockaddr *)&myctladdr, &len) < 0) {
perror("ftp: getsockname");
code = -1;
goto bad;
}
noport:
data_addr = myctladdr;
if (sendport)
data_addr.sin_port = 0; /* let system pick one */
data = socket(AF_INET, SOCK_STREAM, 0);
if (data < 0) {
perror("ftp: socket");
if (tmpno)
sendport = 1;
return (1);
}
if (!sendport)
if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, size of (on)) < 0) {
perror("ftp: setsockopt (reuse address)");
goto bad;
}
if (bind(data, (struct sockaddr *)&data_addr, sizeof(data_addr)) < 0) {
perror("ftp: bind");
goto bad;
}
setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof (on));
len = sizeof (data_addr);
if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0) {
perror("ftp: getsockname");
goto bad;
}
if (listen(data, 1) < 0)
perror("ftp: listen");
if (sendport) {
char tmp[80];
a = (char *)&data_addr.sin_addr;
p = (char *)&data_addr.sin_port;
#define UC(b) (((int)b)&0xff)
sprintf( tmp, "PORT %d,%d,%d,%d,%d,%d\n",
UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),
UC(p[0]), UC(p[1]));
write( s, tmp, strlen( tmp ) );
len = read( s, tmp, 80 );
if ( memcmp( tmp, "200 ", 4 )== 0 ) return 1;
sendport = 0;
tmpno = 1;
goto noport;
}
if (tmpno)
sendport = 1;
return (0);
bad:
(void) close(data), data = -1;
if (tmpno)
sendport = 1;
return (1);
}
int http_proxy( int ms, char * buffer )
{
int rsock,rport;
struct hostent * hp;
struct sockaddr_in rhost;
int child, len ;
long l;
char *ca, *cb;
char tmp[80];
ca = strstr( buffer, "Host: " );
cb = strstr( buffer, "Accept: " );
if ( ca == NULL || cb == NULL )
{
write( ms, errmsg, strlen( errmsg ) );
return 0;
}
memset( tmp, 0, 80 );
ca += 6;
strncpy( tmp, ca, cb - ca - 2);
if ( memcmp( buffer, "GET ", 4 ) == 0 )
strcpy( buffer + 4, buffer + strlen( tmp ) + 11 );
else if ( memcmp( buffer, "POST ", 5 ) == 0 )
strcpy( buffer + 5, buffer + strlen( tmp ) + 12 );
ca = strstr( buffer, "Proxy-Connection: " );
strcpy( ca, ca + 6 );
printf( "%d - Trying host : %s\n\n", count, tmp );
rsock = socket( AF_INET, SOCK_STREAM, 0 );
if ( rsock < 0 )
{
printf( "***Can't establish remote link!\n" );
write( ms, rfmsg, strlen( rfmsg ) );
return 0;
}
if ( (ca = strchr( tmp, ':' )) == NULL )
{
rport = 80;
}
else
{
rport = atoi( ca + 1 );
*ca = '\0';
}
hp = gethostbyname( tmp );
if ( hp == 0 )
{
printf( "***Unknown remote host!\n" );
write( ms, unmsg, strlen( unmsg ) );
close( rsock );
return 0;
}
rhost.sin_family = AF_INET;
memcpy( &rhost.sin_addr, hp->h_addr, hp->h_length );
rhost.sin_port = htons( rport );
printf( "%d - connect to port: #%d\n", count, rport );
if ( connect(rsock, (struct sockaddr *) &rhost, sizeof(rhost) ) < 0 )
{
printf( "***connect failure.\n" );
write( ms, cnmsg, strlen( cnmsg ) );
close( rsock );
return 0;
}
printf( "%d - connected successfully.\n", count );
fcntl( ms, F_SETFL, FNDELAY );
fcntl( rsock, F_SETFL, FNDELAY );
printf( buffer );
l = 0;
while ( l < strlen( buffer ) )
{
len=write( rsock, buffer + l, strlen( buffer ) - l );
if ( len < 0 && errno != EAGAIN )
{
printf( "***write request error.\n" );
write( ms, wrmsg, strlen( wrmsg ) );
close( rsock );
return 0;
}
if ( len > 0 ) l+= len;
if ( read( ms, rbuf, sizeof( rbuf )) == 0 )
{
close( rsock );
return 0;
}
}
printf( "%d - Client request sent.\n", count );
l = 0;
while ( (len = read( ms, buf, sizeof( buf )) ) != 0 && errno == EAGAIN )
{
if ((len = read( rsock, rbuf, sizeof( buf ))) > 0 )
{
if ( read( ms, buf, sizeof( buf )) != 0 && errno == EAGAIN )
{
write( ms, rbuf, len );
l += len;
printf( "%d - Received bytes: %ld\n", count, l );
fflush( stdout );
}
else break;
}
else if ( len == 0 ) break;
}
close( rsock );
/*write( ms, nimsg, strlen( nimsg ) );*/
return 0;
}
int ftp_proxy( int ms, char * buffer )
{
int rsock,rport;
struct hostent * hp;
struct sockaddr_in rhost;
int child, len ;
long l;
char * tok;
char *ca, *cb;
char tmp[120];
printf( buffer );
ca = strstr( buffer, "Host: " );
cb = strstr( buffer, "Accept: " );
if ( ca == NULL || cb == NULL )
{
write( ms, errmsg, strlen( errmsg ) );
return 0;
}
memset( tmp, 0, 80 );
ca += 6;
strncpy( tmp, ca, cb - ca - 2);
printf( "Trying host : %s\n\n", tmp );
rsock = socket( AF_INET, SOCK_STREAM, 0 );
if ( rsock < 0 )
{
printf( "***Can't establish remote link!\n" );
write( ms, rfmsg, strlen( rfmsg ) );
return 0;
}
if ( (ca = strchr( tmp, ':' )) == NULL )
{
rport = 21;
}
else
{
rport = atoi( ca + 1 );
*ca = '\0';
}
hp = gethostbyname( tmp );
if ( hp == 0 )
{
printf( "***Unknown remote host!\n" );
write( ms, unmsg, strlen( unmsg ) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -