📄 265.htm
字号:
<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 + -