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

📄 265.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="192.htm">上一层</a>][<a href="266.htm">下一篇</a>]
<hr><p align="left"><small>发信人: zinger.bbs@cs3.xmu.edu.cn (小白鼠), 信区: Programming <br>

标  题: Re: 如何编写proxy程序? <br>

发信站: XMU CS BBS (Thu Nov 13 15:53:33 1997) <br>

转信站: whbbs!ustcnews!sjtunews!xmucs <br>

Origin: cs3.xmu.edu.cn <br>

【 在 MZY.bbs@bbs.sjtu.edu.cn (阳阳) 的大作中提到: 】 <br>

: 想在浏览器得到heml文件前做些处理,然后再传到浏览器上, <br>

: 是不是要用proxy做个代理,还是有别的方法? <br>

: 谁能说说思路? <br>

 这是我一年前从武汉一个网友手上拿到的. <br>

请大家注意 copyright 声明. <br>

 这个程序实现了基本的proxy.只是ftp proxy 不够好用. <br>

http proxy 在 query 时有些bug.比如用dejanews就老是 <br>

说没有数据返回. <br>

 不知道有没有新版本. <br>

/* Linux PROXY <br>

 * (c)Copyright Hu Qiwei, Tsinghua Univ. <br>

 *    1996, Beijing, P.R.China. <br>

 *    for free distributing <br>

 */ <br>

#include <stdio.h> <br>

#include <string.h> <br>

#include <errno.h> <br>



#include <stdlib.h> <br>

#include <netinet/in.h> <br>

#include <netdb.h> <br>

#include <fcntl.h> <br>

#include <sys/file.h> <br>

#include <signal.h> <br>

#include <sys/socket.h> <br>

char buf[1024]; <br>

char rbuf[1024]; <br>

int  count = 1; <br>

char *nimsg = "This function has not been implemented yet!\n"; <br>

char *errmsg = "Error : unknown command!\n"; <br>

char *rfmsg = "Proxy error: remote link failure.\n"; <br>

char *unmsg = "Proxy error: unknown remote host.\n"; <br>

char *cnmsg = "Proxy error: connection failure.\n"; <br>

char *wrmsg = "Proxy error: can't send request.\n"; <br>

int data = 0; <br>

int code; <br>

struct  sockaddr_in data_addr; <br>

struct  sockaddr_in myctladdr; <br>

int sendport = -1; <br>

int initconn( int s ) <br>



{ <br>

        register char *p, *a; <br>

        int result, len, tmpno = 0; <br>

        int on = 1; <br>

        len = sizeof (myctladdr); <br>

        if (getsockname(s, (struct sockaddr *)&myctladdr, &len) < 0) { <br>

                perror("ftp: getsockname"); <br>

                code = -1; <br>

                goto bad; <br>

        } <br>

noport: <br>

        data_addr = myctladdr; <br>

        if (sendport) <br>

                data_addr.sin_port = 0; /* let system pick one */ <br>

        data = socket(AF_INET, SOCK_STREAM, 0); <br>

        if (data < 0) { <br>

                perror("ftp: socket"); <br>

                if (tmpno) <br>

                        sendport = 1; <br>

                return (1); <br>

        } <br>

        if (!sendport) <br>



                if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, <br>

size <br>

of (on)) < 0) { <br>

                        perror("ftp: setsockopt (reuse address)"); <br>

                        goto bad; <br>

                } <br>

        if (bind(data, (struct sockaddr *)&data_addr, sizeof(data_addr)) < 0 <br>

) { <br>

                perror("ftp: bind"); <br>

                goto bad; <br>

        } <br>

    setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof (on)); <br>

        len = sizeof (data_addr); <br>

        if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0) { <br>

                perror("ftp: getsockname"); <br>

                goto bad; <br>

        } <br>

        if (listen(data, 1) < 0) <br>

                perror("ftp: listen"); <br>

        if (sendport) { <br>

        char tmp[80]; <br>

                a = (char *)&data_addr.sin_addr; <br>



                p = (char *)&data_addr.sin_port; <br>

#define UC(b)   (((int)b)&0xff) <br>

        sprintf( tmp, "PORT %d,%d,%d,%d,%d,%d\n", <br>

                      UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), <br>

                      UC(p[0]), UC(p[1])); <br>

        write( s, tmp, strlen( tmp ) ); <br>

        len = read( s,  tmp, 80 ); <br>

        if ( memcmp( tmp, "200 ", 4 )== 0 ) return 1; <br>

        sendport = 0; <br>

        tmpno = 1; <br>

        goto noport; <br>

        } <br>

        if (tmpno) <br>

                sendport = 1; <br>

        return (0); <br>

bad: <br>

        (void) close(data), data = -1; <br>

        if (tmpno) <br>

                sendport = 1; <br>

        return (1); <br>

} <br>

int http_proxy( int ms, char * buffer ) <br>



{ <br>

    int rsock,rport; <br>

    struct hostent * hp; <br>

    struct sockaddr_in rhost; <br>

    int child, len ; <br>

    long l; <br>

    char *ca, *cb; <br>

    char tmp[80]; <br>

    ca = strstr( buffer, "Host: " ); <br>

    cb = strstr( buffer, "Accept: " ); <br>

    if ( ca == NULL || cb == NULL ) <br>

    { <br>

        write( ms, errmsg, strlen( errmsg ) ); <br>

        return 0; <br>

    } <br>

    memset( tmp, 0, 80 ); <br>

    ca += 6; <br>

    strncpy( tmp, ca, cb - ca - 2); <br>

    if ( memcmp( buffer, "GET ", 4 ) == 0 ) <br>

        strcpy( buffer + 4, buffer + strlen( tmp ) + 11 ); <br>

    else if ( memcmp( buffer, "POST ", 5 ) == 0 ) <br>

        strcpy( buffer + 5, buffer + strlen( tmp ) + 12 ); <br>



    ca = strstr( buffer, "Proxy-Connection: " ); <br>

    strcpy( ca, ca + 6 ); <br>

    printf( "%d - Trying host : %s\n\n", count, tmp ); <br>

    rsock = socket( AF_INET, SOCK_STREAM, 0 ); <br>

    if ( rsock < 0 ) <br>

    { <br>

        printf( "***Can't establish remote link!\n" ); <br>

        write( ms, rfmsg, strlen( rfmsg ) ); <br>

        return 0; <br>

    } <br>

    if ( (ca = strchr( tmp, ':' )) == NULL ) <br>

    { <br>

        rport = 80; <br>

    } <br>

    else <br>

    { <br>

        rport = atoi( ca + 1 ); <br>

        *ca = '\0'; <br>

    } <br>

    hp = gethostbyname( tmp ); <br>

    if ( hp == 0 ) <br>

    { <br>

    { <br>

        printf( "***Unknown remote host!\n" ); <br>

        write( ms, unmsg, strlen( unmsg ) ); <br>

        close( rsock ); <br>

        return 0; <br>

    } <br>

    rhost.sin_family = AF_INET; <br>

    memcpy( &rhost.sin_addr, hp->h_addr, hp->h_length ); <br>

    rhost.sin_port = htons( rport ); <br>

    printf( "%d - connect to port: #%d\n", count, rport ); <br>

    if ( connect(rsock, (struct sockaddr *) &rhost, sizeof(rhost) ) < 0 ) <br>

    { <br>

        printf( "***connect failure.\n" ); <br>

        write( ms, cnmsg, strlen( cnmsg ) ); <br>

        close( rsock ); <br>

        return 0; <br>

    } <br>

    printf( "%d - connected successfully.\n", count ); <br>

    fcntl( ms, F_SETFL, FNDELAY ); <br>

    fcntl( rsock, F_SETFL, FNDELAY ); <br>

    printf( buffer ); <br>

    l = 0; <br>

    while ( l < strlen( buffer ) ) <br>



    { <br>

        len=write( rsock, buffer + l, strlen( buffer ) - l ); <br>

        if ( len < 0 && errno != EAGAIN ) <br>

        { <br>

            printf( "***write request error.\n" ); <br>

            write( ms, wrmsg, strlen( wrmsg ) ); <br>

            close( rsock ); <br>

            return 0; <br>

        } <br>

        if ( len > 0 ) l+= len; <br>

        if ( read( ms, rbuf, sizeof( rbuf )) == 0 ) <br>

        { <br>

            close( rsock ); <br>

            return 0; <br>

        } <br>

    } <br>

    printf( "%d - Client request sent.\n", count ); <br>

    l = 0; <br>

        while ( (len = read( ms, buf, sizeof( buf )) ) != 0  && <br>

                errno == EAGAIN ) <br>

        { <br>

            if ((len = read( rsock, rbuf, sizeof( buf ))) > 0 ) <br>



            { <br>

                if ( read( ms, buf, sizeof( buf )) != 0 && <br>

                     errno == EAGAIN ) <br>

                { <br>

                    write( ms, rbuf, len ); <br>

                    l += len; <br>

                    printf( "%d - Received bytes: %ld\n", count, l ); <br>

                    fflush( stdout ); <br>

                } <br>

                else break; <br>

            } <br>

            else if ( len == 0 ) break; <br>

        } <br>

    close( rsock ); <br>

    /*write( ms, nimsg, strlen( nimsg ) );*/ <br>

    return 0; <br>

} <br>

int ftp_proxy( int ms, char * buffer ) <br>

{ <br>

    int rsock,rport; <br>

    struct hostent * hp; <br>

    struct sockaddr_in rhost; <br>



    int child, len ; <br>

    long l; <br>

    char * tok; <br>

    char *ca, *cb; <br>

    char tmp[120]; <br>

    printf( buffer ); <br>

    ca = strstr( buffer, "Host: " ); <br>

    cb = strstr( buffer, "Accept: " ); <br>

    if ( ca == NULL || cb == NULL ) <br>

    { <br>

        write( ms, errmsg, strlen( errmsg ) ); <br>

        return 0; <br>

    } <br>

    memset( tmp, 0, 80 ); <br>

    ca += 6; <br>

    strncpy( tmp, ca, cb - ca - 2); <br>

    printf( "Trying host : %s\n\n", tmp ); <br>

    rsock = socket( AF_INET, SOCK_STREAM, 0 ); <br>

    if ( rsock < 0 ) <br>

    { <br>

        printf( "***Can't establish remote link!\n" ); <br>

        write( ms, rfmsg, strlen( rfmsg ) ); <br>



        return 0; <br>

    } <br>

    if ( (ca = strchr( tmp, ':' )) == NULL ) <br>

    { <br>

        rport = 21; <br>

    } <br>

    else <br>

    { <br>

        rport = atoi( ca + 1 ); <br>

        *ca = '\0'; <br>

    } <br>

    hp = gethostbyname( tmp ); <br>

    if ( hp == 0 ) <br>

    { <br>

        printf( "***Unknown remote host!\n" ); <br>

        write( ms, unmsg, strlen( unmsg ) ); <br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -