📄 277.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="278.htm">下一篇</a>]
<hr><p align="left"><small>发信人: guru (好读书,不求甚解), 信区: UNP <br>
标 题: 简单的web代理服务器 <br>
发信站: UNIX编程 (2001年08月17日20:38:18 星期五), 站内信件 <br>
<br>
: 简单的web代理服务器。 <br>
:作者 kenvin (stranger) <br>
:时间 11/12/99 09:55 PM <br>
<br>
<br>
<br>
This is my first program write on linux. <br>
<br>
/******************** <br>
Free software,have fun. <br>
By kenvin hwang,1999.11 <br>
<br>
Version revision: <br>
1999.11.11: Version0.97,The first available version <br>
*/ <br>
#include <br>
#include <br>
#include <br>
#include <br>
#include <br>
#include <br>
#include <br>
#include <br>
#include <br>
<br>
#define PORT 9242 <br>
<br>
void main(int argc, char* argv[]){ <br>
struct sockaddr_in server,client; <br>
int fd,peer,size,pid; <br>
int service(int fd); <br>
void *sig_wait(); <br>
<br>
signal(SIGCLD,sig_wait()); <br>
<br>
//Create a new socket <br>
if((fd = socket(AF_INET,SOCK_STREAM,0))<0){ <br>
printf("%s","Create socket failed!"); <br>
exit(-1); <br>
} <br>
<br>
//Populate the sockaddr_in struct <br>
server.sin_family = AF_INET; <br>
server.sin_port = htons(PORT); <br>
server.sin_addr.s_addr = htonl(INADDR_ANY); <br>
bzero(&(server.sin_zero),8); <br>
<br>
//Bind the address to a socket describtor <br>
if( bind(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))<0){ <br>
close(fd); <br>
printf("%s","Bind failed\n"); <br>
exit(-1); <br>
} <br>
<br>
//I'a ready now :-) <br>
listen(fd,5); <br>
<br>
for(;;){ <br>
if((peer = accept(fd,(struct sockaddr *)&client,&size))<0){ <br>
continue; <br>
continue; <br>
} <br>
<br>
if((pid=fork())<0){ <br>
close(peer); <br>
printf("%s","Fork() failed\n"); <br>
exit(-1); <br>
}else if(pid==0){ //The child service the requery,parent back to listen <br>
close(fd); <br>
service(peer); <br>
close(peer); <br>
exit(0); <br>
} <br>
close(peer); <br>
} <br>
} <br>
<br>
void *sig_wait(){ <br>
int pid,*status; <br>
while((pid=wait3(status,WNOHANG,(struct rusage *)0))>0); <br>
} <br>
<br>
/*Service the client*/ <br>
int service(int sockfd){ <br>
char *data,*host; <br>
void *buffer; <br>
int fd, pos1, len; <br>
char *str_clump(char *source, char *left, char *right) ; <br>
char *str_mid(char *source , long start, long len); <br>
char *str_replace(char *source ,char *pattern, char *new); <br>
int sock_connect(int fd, char *host); <br>
<br>
buffer = (void *)malloc(4096); <br>
data = (char *)malloc(4096); <br>
if(read(sockfd,buffer,4096)<=0) return(-1); <br>
data = (char *)buffer; <br>
host = str_clump(data,"//","/"); //Get the web server's host name <br>
<br>
//Connect to remote host <br>
fd = socket(AF_INET,SOCK_STREAM,0); <br>
if(sock_connect(fd,host)<0){ <br>
free(buffer); <br>
free(data); <br>
close(fd); <br>
return(-1); <br>
return(-1); <br>
} <br>
<br>
pos1 = str_pos(data,"GET ",0); <br>
len = str_pos(data,"/",13) - pos1; <br>
data = str_replace(data,str_mid(data, pos1, len), "GET "); <br>
printf("%s",data); <br>
<br>
//Read data from remote host and write it to the requery host <br>
write(fd, (void *)data, strlen(data)); <br>
while((len=recv(fd, buffer,4096,0))>0){ <br>
printf("Read %d bytes data from %s\n",len,host); <br>
if( send(sockfd, buffer,len,0)<0){ <br>
printf("Send failed!\n"); <br>
break; <br>
} <br>
} <br>
<br>
close(fd); <br>
free(data); <br>
free(buffer); <br>
return(0); <br>
} <br>
} <br>
<br>
/*Connect to remote host*/ <br>
int sock_connect(int sockfd,char *host){ <br>
<br>
struct sockaddr_in target; <br>
struct hostent *he; <br>
u_long inaddr; <br>
<br>
target.sin_family = AF_INET; <br>
target.sin_port = htons(80); <br>
bzero(&(target.sin_zero),8); <br>
<br>
//First try number-dotted host name then try the offical host name <br>
if((inaddr=inet_addr(host)) !=INADDR_NONE){ <br>
bcopy((char *)inaddr,(char *)&target.sin_addr,sizeof(inaddr)); <br>
}else if((he = gethostbyname(host))!=NULL){ <br>
bcopy(he->h_addr,(char *)&target.sin_addr,sizeof(inaddr)); <br>
}else{ <br>
printf("Resolve the host % failed!\n\n", host); <br>
return(-1); <br>
} <br>
<br>
<br>
if(connect(sockfd,(struct sockaddr *)&target,sizeof(struct sockaddr))<0){ <br>
printf("Connect to host %s failed\n\n",host); <br>
return(-1); <br>
} <br>
<br>
printf("Connect to host %s OK\n\n",host); <br>
return(0); <br>
} <br>
<br>
<br>
/*Location the substring is source string*/ <br>
int str_pos(char *source, char *substring,int start ){ <br>
long pos; <br>
<br>
if(start>strlen(source)){ <br>
return(-1); <br>
} <br>
<br>
pos = strstr(source+start,substring)-source; <br>
return(pos+1); <br>
} <br>
<br>
<br>
/*Get a substring from start,and the lenght is len*/ <br>
char *str_mid(char *source, long start,long len){ <br>
char *temp,*ptr; <br>
long i; <br>
<br>
if(start>strlen(source)){ <br>
return(0); <br>
} <br>
<br>
temp =(char *) malloc(len+1); <br>
ptr = temp; <br>
source +=(--start); <br>
for(i=0;i *(temp++)= *(source++); <br>
} <br>
*(temp+len)=0; <br>
<br>
return(ptr); <br>
} <br>
<br>
/*Return the substring between left and right*/ <br>
char *str_clump(char *source, char *left, char *right){ <br>
int pos1,pos2,len; <br>
pos1 = str_pos(source, left,0)+strlen(left); <br>
pos2 = str_pos(source, right,pos1); <br>
len = pos2 - pos1; <br>
if(len<=0){ <br>
return(0); <br>
} <br>
<br>
return(str_mid(source,pos1,len)); <br>
} <br>
<br>
<br>
/*Repalce a specifical substring is source with new substring */ <br>
char *str_replace(char *source,char *pattern,char *new){ <br>
int pos1,len; <br>
char *buffer,*temp; <br>
<br>
pos1 = str_pos(source,pattern,0); <br>
if(pos1<=0){ <br>
return(source); <br>
} <br>
<br>
len = strlen(pattern); <br>
buffer = source+pos1+len-1; <br>
temp =str_mid(source,1,pos1-1); <br>
temp = strcat(temp,new); <br>
buffer = strcat(temp,buffer); <br>
<br>
return(buffer); <br>
} <br>
<br>
<br>
<br>
<br>
-- <br>
Target Locked:Guru In Darkness. <br>
我只是一只静静卧着的狮子。。。 <br>
※ 修改:·guru 於 08月17日20:38:32 修改本文·[FROM: 202.114.36.176] <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.36.176] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="192.htm">上一层</a>][<a href="278.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -