亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

一個簡易的proxy程序的開發過程(1)

2019-11-17 05:30:45
字體:
來源:轉載
供稿:網友

  一個簡易的PRoxy程序的開發過程(1)
1、引言
很多人都看過Eric Steven Raymond寫的<<The Cathedral and the Bazaar>> (大教堂與集市) 這篇文章吧。
這篇文章講述了傳統的開發小組開發方式和基于Internet的分散的開發方式(linux的開發方式,GNU軟件的
開發方式)的區別,并且根據自己的一個程序的開發例子來講述了The Bazaar開發方式的若干條重要原則。
不過,國內很多程序員,工作的時候還是采用的傳統的開發方式,很難有機會在工作中體驗這些原則。那么,
這個例子就給了大家又一個體驗這些原則的過程。
這個例子,主要是運用了一些編程的技術,比如,socket編程,信號,進程,還有一些unix socket編程的較
高級論題。當然,這些都不是主要的,重要的是,體驗一下集市的開發方式。

2、開發這個proxy程序的背景
我工作的時候,處在一個比較封閉的網絡環境中。我的機器在局域網 (LAN) 之中,與外界的Internet相連采
用了代理的方式,有若干臺unix服務器作為代理服務器,運行squid作為http的代理,運行socks作為socks 5
代理。應該說,這樣的待遇,還算不錯,:-), 要瀏覽網站,squid夠用了;要運行ICQ, OICQ之類的程序,用
socks也夠了。但是,我碰到了一個比較麻煩的問題,在這樣的網絡環境中,我沒有辦法用Outlook等工具收取
非來自公司郵件服務器的郵件(比方說,@linuxaid.com.cn, @163.net, @sina.com.cn 等等);也沒有辦法用
Gravity等工具來收取USENET上的討論。當然,折衷的辦法還是有,我可以用linux下的一些支持socks的郵件
客戶端軟件和新聞組閱讀軟件。但是,這樣勢必造成一些麻煩( 實際上我也這樣做過 ),當我需要收取郵件
或者閱讀新聞組的時候,我必須重新啟動機器轉換到linux操作系統中去,而當我要辦公的時候,我又不得不
重新啟動機器再轉換到windows操作系統中來 ( 我不得不說,linux作為辦公的桌面還是不如windows, 雖然這
句話肯定會惹惱很多linux fan :-) )。作為一個程序員,我當然不能忍受這種麻煩。我必須想辦法來解決這
個問題。經過考慮,我有了一個好的想法。
這體現了The Bazaar原則一:
Every good work of software starts by scratching a developer's personal itch.
每一個軟件的開發都是帶有開發者自己的烙印。
3、初期設計
我需要的是一個程序,他能夠做"二傳手"的工作。他自身處在能同時連通外界目標服務器和我的機器的位置上。
我的機器把請求發送給他,他接受請求,把請求原封不動的抄下來發送給外界目標服務器;外界目標服務器
響應了請求,把回答發送給他,他再接受回答,把回答原封不動的抄下來發送給我的機器。這樣,我的機器
實際上是把他當作了目標服務器( 由于是原封不動的轉抄,請求和回答沒有被修改 )。而他則是外界目標
服務器的客戶端( 由于是原封不動的轉抄,請求和回答沒有被修改 )。我把這種代理服務程序叫做"二傳手"。
原理圖如下:

-------------- ----------------- --------------------
------------------> ---------------->
我的機器 代理服務程序 目標服務器

<------------------ <----------------
-------------- ----------------- --------------------

4、例子重用
The Bazaar原則二:
Good programmers know what to write. Great ones know what to rewrite (and reuse).
好的程序員知道寫什么。而偉大的程序員知道重寫和重用什么。
基于這個原則,我當然不會從頭來寫這個程序(其實,這個程序是一個很小的程序,沒有必要一定要這么做。
但是,為了給大家,同時也是給我自己一個集市化的開發方式的體驗,我還是這么做了,我先是寫出來了一個
簡單的程序---附在本文最后----然后才想起來去找找有沒有類似的程序 :-), 結果浪費了很多時間)。
在網上找了找,花了大概半個小時( 和我寫出第一個簡單程序所花的時間差不多 :-) ),找到了這個程序。
程序如下:
------------------------------------------------------------------------------------------------
/****************************************************************************
program: proxyd
module: proxyd.c
summary: provides proxy tcp service for a host on an isolated network.

programmer: Carl Harris (ceharris@vt.edu)
date: 22 Feb 94

description:
This code implements a daemon process which listens for tcp connec-
tions on a specified port number. When a connection is established,
a child is forked to handle the new client. The child then estab-
lishes a tcp connection to a port on the isolated host. The child
then falls into a loop in which it writes data to the isolated host
for the client and vice-versa. Once a child has been forked, the
parent resumes listening for additional connections.

The name of the isolated host and the port to serve as proxy for,
as well as the port number the server listen on are specified as
command line arguments.
****************************************************************************/


#include <stdio.h>
#include <ctype.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>


#define TCP_PROTO "tcp"

int proxy_port; /* port to listen for proxy connections on */
strUCt sockaddr_in hostaddr; /* host addr assembled from gethostbyname() */

extern int errno; /* defined by libc.a */
extern char *sys_errlist[]; /* defined by libc.a */


void parse_args (int argc, char **argv);
void daemonize (int servfd);
void do_proxy (int usersockfd);
void reap_status (void);
void errorout (char *msg);



/****************************************************************************

function: main
description: Main level driver. After daemonizing the process, a socket
is opened to listen for connections on the proxy port,
connections are accepted and children are spawned to handle
each new connection.
arguments:
argc,argv you know what those are.

return value: none.
calls: parse_args, do_proxy.
globals: reads proxy_port.
****************************************************************************/

main (argc,argv)
int argc;
char **argv;
{
int clilen;
int childpid;
int sockfd, newsockfd;
struct sockaddr_in servaddr, cliaddr;

parse_args(argc,argv);

/* prepare an address struct to listen for connections */
bzero((char *) &servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = proxy_port;

/* get a socket... */
if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) {
fputs("failed to create server socket
",stderr);
exit(1);
}

/* ...and bind our address and port to it */
if (bind(sockfd,(struct sockaddr_in *) &servaddr,sizeof(servaddr)) < 0) {
fputs("faild to bind server socket to specified port
",stderr);
exit(1);
}

/* get ready to accept with at most 5 clients waiting to connect */
listen(sockfd,5);

/* turn ourselves into a daemon */
daemonize(sockfd);

/* fall into a loop to accept new connections and spawn children */
while (1) {

/* accept the next connection */
clilen = sizeof(cliaddr);
newsockfd = accept(sockfd, (struct sockaddr_in *) &cliaddr, &clilen);
if (newsockfd < 0 && errno == EINTR)
continue; /* a signal might interrupt our accept() call */
else if (newsockfd < 0)
/* something quite amiss -- k

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品十八以下禁看| 日韩精品免费看| 国产精品免费一区二区三区都可以| 亚洲欧美日韩中文视频| 国产成人在线精品| 欧美丰满老妇厨房牲生活| 91精品国产91久久久久久不卡| 三级精品视频久久久久| 国产欧美亚洲精品| 91福利视频网| 成人妇女免费播放久久久| 久久久久国产精品免费网站| www.亚洲天堂| 欧美日韩综合视频网址| 欧美日韩国产在线看| 孩xxxx性bbbb欧美| 国产91精品视频在线观看| 亚洲国产欧美一区二区三区久久| 日韩中文字幕免费| 97在线免费视频| 亚洲美女中文字幕| 欧美激情xxxx性bbbb| 亚洲精品网址在线观看| 日韩美女视频在线观看| 亚洲欧美国产日韩天堂区| 色偷偷888欧美精品久久久| 欧美小视频在线观看| 国产精品亚洲аv天堂网| 国产精品1234| 黑人极品videos精品欧美裸| 精品视频9999| 91久久国产综合久久91精品网站| 成人网在线视频| 91精品久久久久久久久久入口| 久久天天躁狠狠躁夜夜av| 亚洲免费av网址| 欧美成人在线网站| 日韩成人在线视频| 国产精品久久久| 欧美激情在线播放| 欧美成人在线影院| 91色视频在线导航| 国产精品久久精品| 日韩电影免费在线观看| 欧美精品在线免费播放| 亚洲精品日韩激情在线电影| 精品欧美激情精品一区| 日本免费在线精品| 日韩av手机在线看| 日韩欧美国产视频| 在线看片第一页欧美| 日韩中文理论片| 亚洲日本中文字幕| 亚洲自拍偷拍在线| 欧美日韩高清在线观看| 国产一区二区丝袜| 亚洲a中文字幕| 亚洲综合自拍一区| 亚洲乱码av中文一区二区| 成人欧美一区二区三区黑人孕妇| 91久久精品国产91久久性色| 日韩美女免费观看| 亚洲毛片在线观看.| 亚洲欧美精品中文字幕在线| 国外日韩电影在线观看| 久热在线中文字幕色999舞| 亚洲国产成人精品女人久久久| 国产亚洲一区二区在线| 欧美老少配视频| 亚洲a成v人在线观看| 91色视频在线观看| 日韩美女视频在线观看| 色综久久综合桃花网| 国产中文字幕日韩| 九色成人免费视频| 777国产偷窥盗摄精品视频| 日韩av最新在线观看| 欧美电影免费观看大全| 日韩亚洲欧美中文高清在线| 亚洲国产中文字幕在线观看| 日韩专区中文字幕| 日韩在线资源网| 777777777亚洲妇女| 91久久精品国产91性色| 色狠狠久久aa北条麻妃| 欧美野外猛男的大粗鳮| 精品国产精品三级精品av网址| 激情亚洲一区二区三区四区| 亚洲美女av电影| 91精品久久久久久久久中文字幕| 久久精品色欧美aⅴ一区二区| 午夜精品一区二区三区视频免费看| 国产综合香蕉五月婷在线| 久久精品国产2020观看福利| 欧美小视频在线| 国产精品久久久久影院日本| 亚洲日本欧美日韩高观看| 美女福利精品视频| 91嫩草在线视频| 亚洲xxx自由成熟| 欧美激情精品久久久久久蜜臀| 奇米成人av国产一区二区三区| 国产精品一区二区三| 在线日韩第一页| 亚洲成av人乱码色午夜| 日韩激情视频在线播放| 国产亚洲精品成人av久久ww| 亚洲激情视频在线| 91视频国产高清| 91国内精品久久| 精品亚洲男同gayvideo网站| 亚洲性线免费观看视频成熟| 欧美一级片一区| 影音先锋欧美精品| 在线午夜精品自拍| 久久成人精品一区二区三区| 色综合影院在线| 欧美日韩成人在线播放| 欧美精品免费在线| 在线视频欧美性高潮| 亚洲第一福利在线观看| 国产suv精品一区二区三区88区| 亚洲欧美日韩一区二区三区在线| 国产精品日韩欧美综合| 日韩av在线看| 亚洲天堂av在线播放| 欧美亚洲国产视频| 久久艳片www.17c.com| 国产精品第8页| 国产区亚洲区欧美区| 亚洲国语精品自产拍在线观看| 国产日本欧美在线观看| 日韩精品免费视频| 国产一级揄自揄精品视频| 国产日韩在线看片| 亚洲日本中文字幕| 成人久久久久爱| 在线中文字幕日韩| 色www亚洲国产张柏芝| 成人在线精品视频| 日韩成人中文字幕| 国产精品日韩在线观看| 亚洲综合第一页| 亚洲日韩欧美视频一区| 国产成人综合av| 欧美性猛交xxxxx免费看| 成人一区二区电影| 国产高清在线不卡| 欧美xxxx做受欧美| 日韩欧美国产骚| 亚洲影影院av| 久久精品视频免费播放| 国产精品久久久久77777| 亚洲自拍中文字幕| 久久天堂电影网| 亚洲欧美日本另类| 久久久噜噜噜久久久| 成人黄色午夜影院| 欧美精品久久久久久久久| 国产亚洲日本欧美韩国| 国产日韩中文在线| 国产一区二区日韩| 国产精品自产拍在线观| 亚洲最大福利网站|