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

📄 proxy.c

📁 一个支持http,ftp,https代理的代理服务器例程
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -