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

📄 264.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="265.htm">下一篇</a>]
<hr><p align="left"><small>发信人: raner (毕设好无聊呀!), 信区: Linux <br>

标  题: Re: 谁把lenx的datapipe的程序再贴一次? <br>

发信站: BBS 水木清华站 (Wed May  6 21:14:33 1998) <br>

  <br>

【 在 scaner (S.c.a.n.e.R) 的大作中提到: 】 <br>

∶ 如题,想用的时候总是没有,呵呵. <br>

  <br>

/* <br>

一个非常短小实用的程序, 可以非常简单的实现类似proxy的中转功能 <br>

  <br>

比如, 我在mirg运行 <br>

datapipe 2222 21 159.226.23.7 <br>

  <br>

以后, ftp mirg:2222就会通过mirg连接到23.7, 非常的方便 <br>

  <br>

可以用datapipe层层接力, 或者用于实现简单的NAT功能, 十分好玩 :-) <br>

  <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>

  datapipe 2222 23 your.machine.com <br>

  <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>

  <br>

Compile with: <br>

    cc -o datapipe -O datapipe.c <br>

On boxes without strerror() (like SunOS 4.x), compile with: <br>

    cc -o datapipe -O -DSTRERROR datapipe.c <br>

  <br>

Run as: <br>

    datapipe localport remoteport remotehost <br>

  <br>

It will fork itself into the background. <br>

  <br>

/* <br>

 * Datapipe - Create a listen socket to pipe connections to another <br>

 * machine/port. 'localport' accepts connections on the machine running <br>

 * datapipe, which will connect to 'remoteport' on 'remotehost'. Fairly <br>

 * standard 500 xxxx extended errors are used if something drastic <br>



 * 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>

  <br>

Compile with: <br>

    cc -o datapipe -O datapipe.c <br>

On boxes without strerror() (like SunOS 4.x), compile with: <br>

    cc -o datapipe -O -DSTRERROR datapipe.c <br>

  <br>

Run as: <br>

    datapipe localport remoteport remotehost <br>

  <br>

It will fork itself into the background. <br>

  <br>

/* <br>

 * Datapipe - Create a listen socket to pipe connections to another <br>

 * machine/port. 'localport' accepts connections on the machine running <br>

 * datapipe, which will connect to 'remoteport' on 'remotehost'. Fairly <br>

 * standard 500 xxxx extended errors are used if something drastic <br>



 * happens. <br>

 * <br>

 * (c) 1995 Todd Vierling <br>

 * <br>

 * Define STRERROR while compiling on a SunOS 4.x box <br>

 */ <br>

  <br>

#include <sys/types.h> <br>

#include <sys/socket.h> <br>

#include <sys/wait.h> <br>

#include <netinet/in.h> <br>

#include <stdio.h> <br>

#include <stdlib.h> <br>

#include <errno.h> <br>

#include <unistd.h> <br>

#include <netdb.h> <br>

  <br>

#//include <linux/time.h> <br>

  <br>

#ifdef STRERROR <br>

extern char *sys_errlist[]; <br>

extern int sys_nerr; <br>



char *undef = "Undefined error"; <br>

  <br>

char *strerror(error) <br>

  int error; <br>

{ <br>

  if (error > sys_nerr) <br>

    return undef; <br>

  return sys_errlist[error]; <br>

} <br>

#endif <br>

  <br>

main(argc, argv) <br>

  int argc; <br>

  char **argv; <br>

{ <br>

  int lsock, csock, osock; <br>

  FILE *cfile; <br>

  char buf[4096]; <br>

  struct sockaddr_in laddr, caddr, oaddr; <br>

  int caddrlen = sizeof(caddr); <br>

  fd_set fdsr, fdse; <br>

  struct hostent *h; <br>



  struct servent *s; <br>

  int nbyt; <br>

  unsigned long a; <br>

  unsigned short oport; <br>

  <br>

  if (argc != 4) { <br>

    fprintf(stderr,"Usage: %s localport remoteport remotehost\n",argv[0]); <br>

    return 30; <br>

  } <br>

  a = inet_addr(argv[3]); <br>

  if (!(h = gethostbyname(argv[3])) && <br>

      !(h = gethostbyaddr(&a, 4, AF_INET))) { <br>

    perror(argv[3]); <br>

    return 25; <br>

  } <br>

  oport = atol(argv[2]); <br>

  laddr.sin_port = htons((unsigned short)(atol(argv[1]))); <br>

  if ((lsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { <br>

    perror("socket"); <br>

    return 20; <br>

  } <br>

  laddr.sin_family = htons(AF_INET); <br>



  laddr.sin_addr.s_addr = htonl(0); <br>

  if (bind(lsock, &laddr, sizeof(laddr))) { <br>

    perror("bind"); <br>

    return 20; <br>

  } <br>

  if (listen(lsock, 1)) { <br>

    perror("listen"); <br>

    return 20; <br>

  } <br>

  if ((nbyt = fork()) == -1) { <br>

    perror("fork"); <br>

    return 20; <br>

  } <br>

  if (nbyt > 0) <br>

    return 0; <br>

  setsid(); <br>

  while ((csock = accept(lsock, &caddr, &caddrlen)) != -1) { <br>

    cfile = fdopen(csock,"r+"); <br>

    if ((nbyt = fork()) == -1) { <br>

      fprintf(cfile, "500 fork: %s\n", strerror(errno)); <br>

      shutdown(csock,2); <br>

      fclose(cfile); <br>



      continue; <br>

    } <br>

    if (nbyt == 0) <br>

      goto gotsock; <br>

    fclose(cfile); <br>

    while (waitpid(-1, NULL, WNOHANG) > 0); <br>

  } <br>

  return 20; <br>

  <br>

 gotsock: <br>

  if ((osock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { <br>

    fprintf(cfile, "500 socket: %s\n", strerror(errno)); <br>

    goto quit1; <br>

  } <br>

  oaddr.sin_family = h->h_addrtype; <br>

  oaddr.sin_port = htons(oport); <br>

  memcpy(&oaddr.sin_addr, h->h_addr, h->h_length); <br>

  if (connect(osock, &oaddr, sizeof(oaddr))) { <br>

    fprintf(cfile, "500 connect: %s\n", strerror(errno)); <br>

    goto quit1; <br>

  } <br>

  while (1) { <br>

  while (1) { <br>

    FD_ZERO(&fdsr); <br>

    FD_ZERO(&fdse); <br>

    FD_SET(csock,&fdsr); <br>

    FD_SET(csock,&fdse); <br>

    FD_SET(osock,&fdsr); <br>

    FD_SET(osock,&fdse); <br>

    if (select(20, &fdsr, NULL, &fdse, NULL) == -1) { <br>

      fprintf(cfile, "500 select: %s\n", strerror(errno)); <br>

      goto quit2; <br>

    } <br>

    if (FD_ISSET(csock,&fdsr) || FD_ISSET(csock,&fdse)) { <br>

      if ((nbyt = read(csock,buf,4096)) <= 0) <br>

        goto quit2; <br>

      if ((write(osock,buf,nbyt)) <= 0) <br>

        goto quit2; <br>

    } else if (FD_ISSET(osock,&fdsr) || FD_ISSET(osock,&fdse)) { <br>

      if ((nbyt = read(osock,buf,4096)) <= 0) <br>

        goto quit2; <br>

      if ((write(csock,buf,nbyt)) <= 0) <br>

        goto quit2; <br>

    } <br>

  } <br>



  <br>

 quit2: <br>

  shutdown(osock,2); <br>

  close(osock); <br>

 quit1: <br>

  fflush(cfile); <br>

  shutdown(csock,2); <br>

 quit0: <br>

  fclose(cfile); <br>

  return 0; <br>

} <br>

  <br>

-- <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="192.htm">上一层</a>][<a href="265.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 + -