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

📄 277.htm

📁 unix高级编程原吗
💻 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 + -