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

📄 program-datapipe.html

📁 学习linux的工具书
💻 HTML
字号:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
   <meta name="Author" content="Edward Fu">
   <meta name="GENERATOR" content="Mozilla/4.05 [zh-CN] (X11; I; Linux 2.1.127 i686) [Netscape]">
   <title>Freesoft Linux FAQ -- lenx写的datapipe的程序</title>
</head>
<body>
发信人: raner (毕设好无聊呀!),
信区: Linux
<br>标&nbsp; 题: Re: 谁把lenx的datapipe的程序再贴一次?
<br>发信站: BBS 水木清华站 (Wed May&nbsp; 6 21:14:33 1998)
<br>&nbsp;
<br>【 在 scaner (S.c.a.n.e.R) 的大作中提到: 】
<br>∶ 如题,想用的时候总是没有,呵呵.
<br>&nbsp;
<br>/*
<br>一个非常短小实用的程序, 可以非常简单的实现类似proxy的中转功能
<br>&nbsp;
<br>比如, 我在mirg运行
<br>datapipe 2222 21 159.226.23.7
<br>&nbsp;
<br>以后, ftp mirg:2222就会通过mirg连接到23.7, 非常的方便
<br>&nbsp;
<br>可以用datapipe层层接力, 或者用于实现简单的NAT功能, 十分好玩 :-)
<br>&nbsp;
<br>The following is an interesting snippet of code I wrote recently. It
<br>makes a data pipe between a listen port on the machine it's being run
on
<br>and a port on a remote machine. For example, running
<br>&nbsp; datapipe 2222 23 your.machine.com
<br>&nbsp;
<br>would create a port 2222 on the local machine that, if telnetted to,
would
<br>be the same as telnetting to port 23 on your.machine.com. This can
be used
<br>for a variety of purposes: redirect IRC connections so that identd
shows
<br>the username of the datapipe process; redirect sendmail direct connections
<br>for the same reason; even use on a firewall machine to give access
to an
<br>internal service (ftpd, for instance). Cascaded datapipes make for
<br>interesting traceback dilemmas. Questions and comments accepted.
<br>&nbsp;
<br>Compile with:
<br>&nbsp;&nbsp;&nbsp; cc -o datapipe -O datapipe.c
<br>On boxes without strerror() (like SunOS 4.x), compile with:
<br>&nbsp;&nbsp;&nbsp; cc -o datapipe -O -DSTRERROR datapipe.c
<br>&nbsp;
<br>Run as:
<br>&nbsp;&nbsp;&nbsp; datapipe localport remoteport remotehost
<br>&nbsp;
<br>It will fork itself into the background.
<br>&nbsp;
<br>/*
<br>&nbsp;* Datapipe - Create a listen socket to pipe connections to another
<br>&nbsp;* machine/port. 'localport' accepts connections on the machine
running
<br>&nbsp;* datapipe, which will connect to 'remoteport' on 'remotehost'.
Fairly
<br>&nbsp;* standard 500 xxxx extended errors are used if something drastic
<br>&nbsp;* happens.
<br>for a variety of purposes: redirect IRC connections so that identd
shows
<br>the username of the datapipe process; redirect sendmail direct connections
<br>for the same reason; even use on a firewall machine to give access
to an
<br>internal service (ftpd, for instance). Cascaded datapipes make for
<br>interesting traceback dilemmas. Questions and comments accepted.
<br>&nbsp;
<br>Compile with:
<br>&nbsp;&nbsp;&nbsp; cc -o datapipe -O datapipe.c
<br>On boxes without strerror() (like SunOS 4.x), compile with:
<br>&nbsp;&nbsp;&nbsp; cc -o datapipe -O -DSTRERROR datapipe.c
<br>&nbsp;
<br>Run as:
<br>&nbsp;&nbsp;&nbsp; datapipe localport remoteport remotehost
<br>&nbsp;
<br>It will fork itself into the background.
<br>&nbsp;
<br>/*
<br>&nbsp;* Datapipe - Create a listen socket to pipe connections to another
<br>&nbsp;* machine/port. 'localport' accepts connections on the machine
running
<br>&nbsp;* datapipe, which will connect to 'remoteport' on 'remotehost'.
Fairly
<br>&nbsp;* standard 500 xxxx extended errors are used if something drastic
<br>&nbsp;* happens.
<br>&nbsp;*
<br>&nbsp;* (c) 1995 Todd Vierling
<br>&nbsp;*
<br>&nbsp;* Define STRERROR while compiling on a SunOS 4.x box
<br>&nbsp;*/
<br>&nbsp;
<br>#include &lt;sys/types.h>
<br>#include &lt;sys/socket.h>
<br>#include &lt;sys/wait.h>
<br>#include &lt;netinet/in.h>
<br>#include &lt;stdio.h>
<br>#include &lt;stdlib.h>
<br>#include &lt;errno.h>
<br>#include &lt;unistd.h>
<br>#include &lt;netdb.h>
<br>&nbsp;
<br>#//include &lt;linux/time.h>
<br>&nbsp;
<br>#ifdef STRERROR
<br>extern char *sys_errlist[];
<br>extern int sys_nerr;
<br>char *undef = "Undefined error";
<br>&nbsp;
<br>char *strerror(error)
<br>&nbsp; int error;
<br>{
<br>&nbsp; if (error > sys_nerr)
<br>&nbsp;&nbsp;&nbsp; return undef;
<br>&nbsp; return sys_errlist[error];
<br>}
<br>#endif
<br>&nbsp;
<br>main(argc, argv)
<br>&nbsp; int argc;
<br>&nbsp; char **argv;
<br>{
<br>&nbsp; int lsock, csock, osock;
<br>&nbsp; FILE *cfile;
<br>&nbsp; char buf[4096];
<br>&nbsp; struct sockaddr_in laddr, caddr, oaddr;
<br>&nbsp; int caddrlen = sizeof(caddr);
<br>&nbsp; fd_set fdsr, fdse;
<br>&nbsp; struct hostent *h;
<br>&nbsp; struct servent *s;
<br>&nbsp; int nbyt;
<br>&nbsp; unsigned long a;
<br>&nbsp; unsigned short oport;
<br>&nbsp;
<br>&nbsp; if (argc != 4) {
<br>&nbsp;&nbsp;&nbsp; fprintf(stderr,"Usage: %s localport remoteport remotehost\n",argv[0]);
<br>&nbsp;&nbsp;&nbsp; return 30;
<br>&nbsp; }
<br>&nbsp; a = inet_addr(argv[3]);
<br>&nbsp; if (!(h = gethostbyname(argv[3])) &amp;&amp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !(h = gethostbyaddr(&amp;a, 4, AF_INET)))
{
<br>&nbsp;&nbsp;&nbsp; perror(argv[3]);
<br>&nbsp;&nbsp;&nbsp; return 25;
<br>&nbsp; }
<br>&nbsp; oport = atol(argv[2]);
<br>&nbsp; laddr.sin_port = htons((unsigned short)(atol(argv[1])));
<br>&nbsp; if ((lsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
{
<br>&nbsp;&nbsp;&nbsp; perror("socket");
<br>&nbsp;&nbsp;&nbsp; return 20;
<br>&nbsp; }
<br>&nbsp; laddr.sin_family = htons(AF_INET);
<br>&nbsp; laddr.sin_addr.s_addr = htonl(0);
<br>&nbsp; if (bind(lsock, &amp;laddr, sizeof(laddr))) {
<br>&nbsp;&nbsp;&nbsp; perror("bind");
<br>&nbsp;&nbsp;&nbsp; return 20;
<br>&nbsp; }
<br>&nbsp; if (listen(lsock, 1)) {
<br>&nbsp;&nbsp;&nbsp; perror("listen");
<br>&nbsp;&nbsp;&nbsp; return 20;
<br>&nbsp; }
<br>&nbsp; if ((nbyt = fork()) == -1) {
<br>&nbsp;&nbsp;&nbsp; perror("fork");
<br>&nbsp;&nbsp;&nbsp; return 20;
<br>&nbsp; }
<br>&nbsp; if (nbyt > 0)
<br>&nbsp;&nbsp;&nbsp; return 0;
<br>&nbsp; setsid();
<br>&nbsp; while ((csock = accept(lsock, &amp;caddr, &amp;caddrlen)) !=
-1) {
<br>&nbsp;&nbsp;&nbsp; cfile = fdopen(csock,"r+");
<br>&nbsp;&nbsp;&nbsp; if ((nbyt = fork()) == -1) {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(cfile, "500 fork: %s\n", strerror(errno));
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shutdown(csock,2);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fclose(cfile);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp; if (nbyt == 0)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto gotsock;
<br>&nbsp;&nbsp;&nbsp; fclose(cfile);
<br>&nbsp;&nbsp;&nbsp; while (waitpid(-1, NULL, WNOHANG) > 0);
<br>&nbsp; }
<br>&nbsp; return 20;
<br>&nbsp;
<br>&nbsp;gotsock:
<br>&nbsp; if ((osock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
{
<br>&nbsp;&nbsp;&nbsp; fprintf(cfile, "500 socket: %s\n", strerror(errno));
<br>&nbsp;&nbsp;&nbsp; goto quit1;
<br>&nbsp; }
<br>&nbsp; oaddr.sin_family = h->h_addrtype;
<br>&nbsp; oaddr.sin_port = htons(oport);
<br>&nbsp; memcpy(&amp;oaddr.sin_addr, h->h_addr, h->h_length);
<br>&nbsp; if (connect(osock, &amp;oaddr, sizeof(oaddr))) {
<br>&nbsp;&nbsp;&nbsp; fprintf(cfile, "500 connect: %s\n", strerror(errno));
<br>&nbsp;&nbsp;&nbsp; goto quit1;
<br>&nbsp; }
<br>&nbsp; while (1) {
<br>&nbsp;&nbsp;&nbsp; FD_ZERO(&amp;fdsr);
<br>&nbsp;&nbsp;&nbsp; FD_ZERO(&amp;fdse);
<br>&nbsp;&nbsp;&nbsp; FD_SET(csock,&amp;fdsr);
<br>&nbsp;&nbsp;&nbsp; FD_SET(csock,&amp;fdse);
<br>&nbsp;&nbsp;&nbsp; FD_SET(osock,&amp;fdsr);
<br>&nbsp;&nbsp;&nbsp; FD_SET(osock,&amp;fdse);
<br>&nbsp;&nbsp;&nbsp; if (select(20, &amp;fdsr, NULL, &amp;fdse, NULL)
== -1) {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(cfile, "500 select: %s\n", strerror(errno));
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto quit2;
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp; if (FD_ISSET(csock,&amp;fdsr) || FD_ISSET(csock,&amp;fdse))
{
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((nbyt = read(csock,buf,4096)) &lt;=
0)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto quit2;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((write(osock,buf,nbyt)) &lt;= 0)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto quit2;
<br>&nbsp;&nbsp;&nbsp; } else if (FD_ISSET(osock,&amp;fdsr) || FD_ISSET(osock,&amp;fdse))
{
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((nbyt = read(osock,buf,4096)) &lt;=
0)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto quit2;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((write(csock,buf,nbyt)) &lt;= 0)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto quit2;
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp; }
<br>&nbsp;
<br>&nbsp;quit2:
<br>&nbsp; shutdown(osock,2);
<br>&nbsp; close(osock);
<br>&nbsp;quit1:
<br>&nbsp; fflush(cfile);
<br>&nbsp; shutdown(csock,2);
<br>&nbsp;quit0:
<br>&nbsp; fclose(cfile);
<br>&nbsp; return 0;
<br>}
<br>&nbsp;
<br>--
<br>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.68.98]
<br>&nbsp;
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -