📄 proxy.c
字号:
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( "connect to port: #%d\n", rport );
if ( connect(rsock, (struct sockaddr *) &rhost, sizeof(rhost) ) < 0 )
{
printf( "***connect failure.\n" );
write( ms, cnmsg, strlen( cnmsg ) );
close( rsock );
return 0;
}
printf( "connected successfully.\n" );
len = read( rsock, rbuf, 1024 ); rbuf[len] = '\0';
printf( rbuf );
while( strstr( rbuf, "220 ") == NULL )
{
len = read( rsock, rbuf, 1024 ); rbuf[len] = '\0';
printf( rbuf );
}
write( rsock, "USER ftp\n", 9 );
printf( "USER ftp sent.\n" );
len = read( rsock, rbuf, sizeof( rbuf ) ); rbuf[len] = '\0';
printf( rbuf );
if ( memcmp( rbuf, "331 ", 4 ) == 0 )
{
write( rsock, "PASS guest@\n", 12 );
len = read( rsock, rbuf, sizeof( rbuf ) );rbuf[len] = '\0';
}
tok = "230 ";
ca = strstr( buffer, " HTTP/1.0" );
len = ca - buffer - 10 - strlen( tmp ) ;
ca = buffer + 10 + strlen( tmp );
memcpy( tmp, ca, len );
tmp[len]='\0';
if ( len > 0 )
{
while( memcmp( rbuf, "230 ", 4 ) != 0 && strstr(rbuf,"\n230 ") == NULL )
{
len =read( rsock, rbuf, sizeof( rbuf ));
rbuf[len] = '\0';
}
tok = "250 ";
sprintf( buffer, "CWD %s\n", tmp );
printf( buffer );
write( rsock, buffer, strlen( buffer ) );
len = read( rsock, rbuf, sizeof( rbuf ) ); rbuf[len] = '\0';
}
if ( memcmp( rbuf, "550 ", 4 ) == 0 )
{
int data1;
char temp[40];
/* get file */
ca = strrchr( tmp, '/' );
strcpy( temp, ca+1 );
*(ca +1) = '\0';
sprintf( buffer, "CWD %s\n", tmp );
printf( buffer );
write( rsock, buffer, strlen( buffer ));
len = read( rsock, rbuf, sizeof( rbuf ));rbuf[len]='\0';
printf( rbuf );
while( strstr( rbuf, "250 " ) == NULL)
{
len = read( rsock, rbuf, sizeof( rbuf));
rbuf[len] = '\0';
}
write( rsock, "TYPE I\n", 7 );
read( rsock, rbuf, sizeof( rbuf) );
initconn( rsock );
sprintf( buffer, "RETR %s\n", temp );
printf( buffer );
write( rsock, buffer, strlen( buffer) );
read( rsock, rbuf, sizeof( rbuf ) );
printf( rbuf );
if ( memcmp( rbuf, "550 ", 4 ) != 0 )
{
data1 = accept( data, (struct sockaddr *)NULL, (int * )NULL );
l = 0;
do
{
memset( rbuf, 0, sizeof( rbuf) );
if (( len = read( data1, rbuf, sizeof( rbuf) )) < 0)
puts( "Error in read stream message." );
else if ( len == 0 )
puts( "\n[ftp : end of connection.]\n" );
else
{
write( ms, rbuf, len );
l += len;
printf( "%d - Received bytes : %ld\n", count, l );
}
} while( len != 0 );
close( data1 );
}
close( data );
}
else
{
/* list directory */
int data1;
char temp[40];
if ( tmp[0] == '\0' ) strcpy( tmp, "/" );
sprintf( temp, "<TITLE>FTP Catalog of %s</TITLE>\n", tmp );
write( ms, temp, strlen( temp ));
sprintf( temp, "<H2>Directory of %s</H2><PRE><HR>", tmp );
write( ms, temp, strlen( temp ) );
if ( memcmp( rbuf, tok, 4) != 0 )
{
len = strlen( rbuf ); rbuf[len] = '\0';
sprintf( tmp, "\n%s", tok );
while( memcmp( rbuf, tok, 4) != 0 && strstr(rbuf,tmp) == NULL)
{
write( ms, rbuf, len );
len = read( rsock, rbuf, sizeof( rbuf ) );rbuf[len] = '\0';
}
write( ms, rbuf, len );
write( ms, "<HR>\n", 5 );
}
write( rsock, "TYPE A\n", 7 );
len = read( rsock, rbuf, sizeof( rbuf) ); rbuf[len] = '\0';
printf( rbuf );
initconn( rsock );
write( rsock, "LIST\n", 5 );
len = read( rsock, rbuf, sizeof( rbuf) ); rbuf[len] = '\0';
printf( rbuf );
if ( memcmp( rbuf, "550 ", 4 ) != 0 )
{
data1 = accept( data, (struct sockaddr *)NULL, (int * )NULL );
do
{
memset( rbuf, 0, sizeof( rbuf) );
if (( len = read( data1, rbuf, sizeof( rbuf) )) < 0)
puts( "Error in read stream message." );
else if ( len == 0 )
puts( "\n[ftp : end of connection.]\n" );
else
{
printf( rbuf );
write( ms, rbuf, len );
}
} while( len != 0 );
write( ms, "</PRE>", 6 );
close( data1 );
}
close( data );
}
write( rsock, "QUIT\n", 5 );
len=read( rsock, rbuf, sizeof( rbuf )); rbuf[len] = '\0';
printf( rbuf );
close( rsock );
return 0;
}
int processsock( int ms, char * buffer )
{
if ( memcmp( buffer, "GET http://", 11 ) == 0 && strstr( buffer, "Proxy-Connection: ") != NULL )
{
return http_proxy( ms, buffer );
}
else if ( memcmp( buffer, "POST http://", 12 ) == 0 && strstr( buffer, "Proxy-Connection: ") != NULL )
{
return http_proxy( ms, buffer );
}
else if ( memcmp( buffer, "GET ftp://", 10 ) == 0 && strstr( buffer, "Proxy-Connection: ") != NULL )
{
return ftp_proxy( ms, buffer );
}
else /* unknown service, just echo */
{
printf( "%s", buffer );
write( ms, buffer, strlen( buffer ) );
}
return 1;
}
int main( int argc, char * argv[] )
{
int sock, portnum, length;
struct sockaddr_in server;
struct sockaddr_in peername;
int msgsock, rval ;
printf( "Hu's MiniProxy ver 1.15 (c)Copyright 1996 Hu Qiwei, Tsinghua Univ.\
n" );
if ( argc > 1 )
{
portnum = atoi( argv[1] );
if (portnum < 80) portnum = 80;
}
else
{
printf( "USAGE : proxy [portnum]\n" );
portnum=8787;
}
signal( SIGCLD, SIG_IGN );
sock = socket( AF_INET, SOCK_STREAM, 0 );
if ( sock < 0 )
{
puts( "Error in create socket!" );
exit( 1 );
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(portnum);
if ( bind( sock, (struct sockaddr *)&server, sizeof( server ) ) < 0 )
{
puts( "Error in bind stream." );
exit( 1 );
}
length = sizeof( server );
if ( getsockname( sock, (struct sockaddr * )&server, &length ) < 0 )
{
puts( "Error in get sock name!" );
exit( 1 );
}
printf( "The socket port number has been assigned to #%d\n\n", ntohs( server.sin_port ) );
listen( sock, 20 );
while( 1 )
{
msgsock = accept( sock, (struct sockaddr *)NULL, (int * )NULL );
if ( msgsock == -1 )
{
puts( "Error in accept!" );
exit( 1 );
}
else
if ( fork() == 0 )
{
length = sizeof ( peername );
getpeername(msgsock, (struct sockaddr *)&peername, &length );
printf( "##[%d - Connected to client: %s]\n\n", count, inet_ntoa( peername.sin_addr ) );
do
{
memset( buf, 0, 1024 );
if (( rval = read( msgsock, buf, 1024 )) < 0)
puts( "Error in read stream message." );
else if ( rval == 0 )
puts( "\n[End of connection.]\n" );
else
{
rval = processsock( msgsock, buf );
}
} while( rval != 0 );
printf( "##[%d - Shutdown connection to client: %s]\n\n", count, inet_ntoa(peername.sin_addr) );
shutdown( msgsock, 2 );
exit( 0 );
}
printf( "Service #%d resolved.\n", count++ );
close( msgsock );
};
exit( 0 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -