- 浏览: 238598 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
liuqiang5151:
你好,按照这种方式,如果传递参数,在服务端报错
org.ofb ...
ofbiz的服务(service)export成web service的方法(3) -
吹泡泡程序猿:
你甚至会发现自己现在成熟得可怕,一件很复杂的事情,你一眼就看穿 ...
30岁的痛 -
吹泡泡程序猿:
mark
关于BOSS系统以及计费系统的一些书 -
gao241:
您好tower,您介绍的都是电信行业的计费方法,如果是在线支付 ...
计费系统与自主开发 -
javams:
你好,请问你那里有LDAP的分页查询demo吗?谢谢了,如果可 ...
LDAP读书笔记2-LDAP协议
/****************************************************************************
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 <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <sys/resource.h>
#include <sys/wait.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 *) (&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(struct sockaddr_in);
newsockfd = accept(sockfd, (struct sockaddr *) (&cliaddr), &clilen);
if (newsockfd < 0 && errno == EINTR)
continue; /* a signal might interrupt our accept() call */
else if (newsockfd < 0)
/* something quite amiss -- kill the server */
errorout("failed to accept connection");
/* fork a child to handle this connection */
if ((childpid = fork()) == 0) {
close(sockfd);
do_proxy(newsockfd);
exit(0);
}
/* if fork() failed, the connection is silently dropped -- oops! */
close(newsockfd);
}
}
/****************************************************************************
function: parse_args
description: parse the command line args.
arguments:
argc,argv you know what these are.
return value: none.
calls: none.
globals: writes proxy_port, writes hostaddr.
****************************************************************************/
void parse_args (argc,argv)
int argc;
char **argv;
{
int i;
struct hostent *hostp;
struct servent *servp;
unsigned long inaddr;
struct {
char proxy_port [16];
char isolated_host [64];
char service_name [32];
} pargs;
if (argc < 4) {
printf("usage: %s ",argv[0]);
exit(1);
}
strcpy(pargs.proxy_port,argv[1]);
strcpy(pargs.isolated_host,argv[2]);
strcpy(pargs.service_name,argv[3]);
for (i = 0; i < strlen(pargs.proxy_port); i++)
if (!isdigit(*(pargs.proxy_port + i))) break;
if (i == strlen(pargs.proxy_port))
proxy_port = htons(atoi(pargs.proxy_port));
else {
printf("%s: invalid proxy port",pargs.proxy_port);
exit(0);
}
bzero(&hostaddr,sizeof(hostaddr));
hostaddr.sin_family = AF_INET;
if ((inaddr = inet_addr(pargs.isolated_host)) != INADDR_NONE)
bcopy(&inaddr,&hostaddr.sin_addr,sizeof(inaddr));
else if ((hostp = gethostbyname(pargs.isolated_host)) != NULL)
bcopy(hostp->h_addr,&hostaddr.sin_addr,hostp->h_length);
else {
printf("%s: unknown host",pargs.isolated_host);
exit(1);
}
if ((servp = getservbyname(pargs.service_name,TCP_PROTO)) != NULL)
hostaddr.sin_port = servp->s_port;
else if (atoi(pargs.service_name) > 0)
hostaddr.sin_port = htons(atoi(pargs.service_name));
else {
printf("%s: invalid/unknown service name or port number",pargs.service_name);
exit(1);
}
}
/****************************************************************************
function: daemonize
description: detach the server process from the current context,
creating a pristine, predictable environment in which it
will execute.
arguments:
servfd file descriptor in use by server.
return value: none.
calls: none.
globals: none.
****************************************************************************/
void daemonize (servfd)
int servfd;
{
int childpid, fd, fdtablesize;
/* ignore terminal I/O, stop signals */
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
/* fork to put us in the background (whether or not the user
specified '&' on the command line */
if ((childpid = fork()) < 0) {
fputs("failed to fork first child",stderr);
exit(1);
}
else if (childpid > 0)
exit(0); /* terminate parent, continue in child */
/* dissociate from process group */
if (setpgrp(0,getpid()) < 0) {
fputs("failed to become process group leader",stderr);
exit(1);
}
/* lose controlling terminal */
if ((fd = open("/dev/tty",O_RDWR)) >= 0) {
ioctl(fd,TIOCNOTTY,NULL);
close(fd);
}
/* close any open file descriptors */
for (fd = 0, fdtablesize = getdtablesize(); fd < fdtablesize; fd++)
if (fd != servfd) close(fd);
/* set working directory to / to allow filesystems to be unmounted */
chdir("/");
/* clear the inherited umask */
umask(0);
/* setup zombie prevention */
signal(SIGCLD,reap_status);
}
/****************************************************************************
function: do_proxy
description: does the actual work of virtually connecting a client to
the telnet service on the isolated host.
arguments:
usersockfd socket to which the client is connected.
return value: none.
calls: none.
globals: reads hostaddr.
****************************************************************************/
void do_proxy (usersockfd)
int usersockfd;
{
int isosockfd;
fd_set rdfdset;
int connstat;
int iolen;
char buf [2048];
/* open a socket to connect to the isolated host */
if ((isosockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
errorout("failed to create socket to host");
/* attempt a connection */
connstat = connect(isosockfd,(struct sockaddr *) &hostaddr,sizeof(hostaddr));
switch (connstat) {
case 0:
break;
case ETIMEDOUT:
case ECONNREFUSED:
case ENETUNREACH:
strcpy(buf,sys_errlist[errno]);
strcat(buf,"");
write(usersockfd,buf,strlen(buf));
close(usersockfd);
exit(1); /* die peacefully if we can't establish a connection */
break;
default:
errorout("failed to connect to host");
}
/* now we're connected, serve fall into the data echo loop */
while (1) {
/* Select for readability on either of our two sockets */
FD_ZERO(&rdfdset);
FD_SET(usersockfd,&rdfdset);
FD_SET(isosockfd,&rdfdset);
if (select(FD_SETSIZE,&rdfdset,NULL,NULL,NULL) < 0)
errorout("select failed");
/* is the client sending data? */
if (FD_ISSET(usersockfd,&rdfdset)) {
if ((iolen = read(usersockfd,buf,sizeof(buf))) <= 0)
break; /* zero length means the client disconnected */
write(isosockfd,buf,iolen); /* copy to host -- blocking semantics */
}
/* is the host sending data? */
if (FD_ISSET(isosockfd,&rdfdset)) {
if ((iolen = read(isosockfd,buf,sizeof(buf))) <= 0)
break; /* zero length means the host disconnected */
write(usersockfd,buf,iolen); /* copy to client -- blocking semantics */
}
}
/* we're done with the sockets */
close(isosockfd);
close(usersockfd);
}
/****************************************************************************
function: errorout
description: displays an error message on the console and kills the
current process.
arguments:
msg message to be displayed.
return value: none -- does not return.
calls: none.
globals: none.
****************************************************************************/
void errorout (msg)
char *msg;
{
FILE *console;
console = fopen("/dev/console","a");
fprintf(console,"proxyd: %s",msg);
fclose(console);
exit(1);
}
/****************************************************************************
function: reap_status
description: handle a SIGCLD signal by reaping the exit status of the
perished child, and discarding it.
arguments: none.
return value: none.
calls: none.
globals: none.
****************************************************************************/
void reap_status ()
{
int pid;
union wait status;
while ((pid = wait3(&status,WNOHANG,NULL)) > 0); /* loop while there are more dead children */
}
发表评论
-
Linux2.6下如何配置core文件
2009-08-20 17:28 4297下面的资料是从互联网上整理的来的,参考文献如下: http: ... -
Linux下查看FIFO剩余字节的方法
2009-05-05 09:48 1569FIFO做为一种有名管道的形式,在unix下编程经常会用到,在 ... -
一个多对多的消息存储转发工具
2009-04-23 13:41 1313本文原创作品,如需转载请注明来源,作者:姜涛, towerjt ... -
xmlrpc++真的粉OO
2009-03-30 22:26 1256一个改写自py-xmlrpc的c++项目,支持xmlrpc的客 ... -
occi在linux编译运行时报libstdc++.so.6冲突的问题
2009-03-02 16:39 3754OCCI库在linux编译的时候,由于linux版本太高,会提 ... -
被libpq逼疯,闪
2009-02-16 16:32 949postgreSQL的C语言接口库libpq实在是相当的难用, ... -
CMarkupSTL中的复位
2009-02-13 17:22 2105CMarkupSTL是一个C++写的xml操作的轻量级的类,相 ... -
一个C实现的记日志的函数库
2006-04-02 10:02 2379在实际应用中,日志是一个比较重要的部分。在unix下用得比较多 ... -
以为informix没有产生sequence的功能,所以自己造了一个车轮
2006-04-02 10:07 1727#include <unistd.h>#inclu ... -
chinaunix上的flw写的超级trim
2006-04-02 10:10 1087#include <stdlib.h> void ... -
在SunOS8上调试通过的获取指定进程信息的程序
2006-04-02 16:50 829#include <stdio.h>#inc ... -
FastDB程序崩溃后的锁清理
2008-03-18 15:02 2964本文原创作品,如需转载请注明来源,作者:姜涛, tower ... -
FastDB不同访问模式带来的影响
2008-03-18 15:05 3635本文原创作品,如需转载请注明来源,作者:姜涛, tower ... -
yacc的使用
2008-04-03 09:50 3932本来不打算全部拷贝过来的,但是这篇文章在网上已经删除了,我是从 ... -
用Lex和Yacc做一个简单的SQL解释器
2008-04-06 18:13 2380前段时间做了一个简单的内存数据库,需要提供点简单的SQL支持, ... -
incognito的查询接口
2008-04-25 16:19 808今天运气很好,昨天搞了一天的一个查询接口,一直没有成功。下午的 ... -
多线程的pthread_cond_wait后,记住再次检测条件
2008-05-28 11:15 10511一般来说,在多线程竞争一个资源的时候,会用到pthread_c ... -
perl与C和C++集成的问题
2008-07-16 16:18 1064一直在关注脚本语言与C、C++语言集成的问题。我希望我们的业务 ...
相关推荐
proxy源代码,linux下的ftp 代理的源代码,大家多多支持啊
一个基于linux环境开发的简单的proxy源码。经过测试,ssh telnet rdp 都可以使用
这段代码虽然只是描述了最简单的proxy操作,但它的确是经典,它不仅清晰地描述了客户机/服务器系统的概念,而且几乎包括了Linux网络编程的方方面面,非常适合Linux网络编程的初学者学习。 这段Proxy程序的用法是...
Proxy源代码分析--谈谈如何学习linux网络编程 里面有具体的分析和源代码,感觉很是经典,也适合初学者
下载正版原版程序: ...Windows 平台,将下载的charles.jar文件覆盖到安装目录下的lib文件夹下即可完成破解! Mac 平台,将下载的charles.jar文件右键 Charles.app 显示包内容,覆盖到Content->Java下即可完成破解!
linux 网络编程 Proxy源代码分析 经典代码
linux下的proxy软件源码 经典~
MySQL数据库中间件:基于C语言开发,包含59个文件,包括22个C源文件、9个C头文件、5个Linux配置文件、2个Markdown文档、2个PNG图像文件、1个.gitignore文件、1个AUTHORS文件、1个ChangeLog-CN文件、1个LICENSE文件和...
linux 下实现网络代理功能的源码
著名非主流代理软件3proxy源代码,支持http/socks/tcp或udp port map,跨平台,支持linux/windows,vc亲测可用
linux下的http/https 代理程序,简洁高效,处理GET/PUT/POST/HEAD/CONNECT等HTTP协议指令,能满足大多应用需求,希望对编写HTTP代理程序的程序员有帮助。
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
Linux是一个多任务、多用户的操作系统,它以其良好的特性和资源的免费性而得到了蓬勃的发展。 本书通过大量的图示和实例,深入浅出的介绍了Linux的基本原理和应用。主要包括Linux的基本概念和操作,Linux的树型...
node-http-proxy是一个支持websocket的HTTP可编程代理库,适用于实现反向代理和负载平衡器之类的组件。 通过包装node-http-proxy,可配置的-http-proxy将此功能扩展到部署。目录使用REST API REST API基础通过传递...
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...