⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proxy.c

📁 一个支持http,ftp,https代理的代理服务器例程
💻 C
📖 第 1 页 / 共 2 页
字号:

/* 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 + -