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

📄 62.htm

📁 网络编程原理文摘 [文件] 精华区目录结构 [目录] 网络编程的基本原理 [目录] 网络编程与网络协议 [目录] 网上资源 [目录] winsock技术 [目录
💻 HTM
📖 第 1 页 / 共 2 页
字号:

  <br>

  if ((childpid = fork()) < 0) { <br>

    fputs("failed to fork first child\r\n",stderr); <br>

    exit(1); <br>

  } <br>

  else if (childpid > 0) <br>

    exit(0);    /* terminate parent, continue in child */ <br>

  <br>

  /* dissociate from process group */ <br>

  if (setpgrp(0,getpid()) < 0) { <br>

    fputs("failed to become process group leader\r\n",stderr); <br>

    exit(1); <br>

  } <br>

  } <br>

  <br>

  /* lose controlling terminal */ <br>

  if ((fd = open("/dev/tty",O_RDWR)) >= 0) { <br>

    ioctl(fd,TIOCNOTTY,NULL); <br>

    close(fd); <br>

  } <br>

  <br>

  /* close any open file descriptors */ <br>

  for (fd = 0, fdtablesize = getdtablesize();  fd < fdtablesize;  fd++) <br>

    if (fd != servfd) <br>

      close(fd); <br>

  <br>

  /* set working directory to / to allow filesystems to be unmounted */ <br>

  chdir("/"); <br>

  <br>

  /* clear the inherited umask */ <br>

  umask(0); <br>

  <br>

  /* setup zombie prevention */ <br>

  signal(SIGCLD,reap_status); <br>

  <br>

} <br>

} <br>

  <br>

  <br>

  <br>

/**************************************************************************** <br>

  function:      do_proxy <br>

  description:   does the actual work of virtually connecting a client to <br>

                 the telnet service on the isolated host. <br>

  arguments: <br>

    usersockfd   socket to which the client is connected. <br>

  <br>

  return value:  none. <br>

  calls:         none. <br>

  globals:       reads hostaddr. <br>

 ****************************************************************************/ <br>

  <br>

void do_proxy (usersockfd) <br>

int usersockfd; <br>

{ <br>

  int isosockfd; <br>

  fd_set rdfdset; <br>

  int connstat; <br>

  int iolen; <br>

  int iolen; <br>

  char buf [2048]; <br>

  <br>

  /* open a socket to connect to the isolated host */ <br>

  if ((isosockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) <br>

    errorout("failed to create socket to host"); <br>

  <br>

  /* attempt a connection */ <br>

  connstat = connect(isosockfd, <br>

                     (struct sockaddr *) &hostaddr, <br>

                     sizeof(hostaddr)); <br>

  switch (connstat) { <br>

    case 0: <br>

      break; <br>

    case ETIMEDOUT: <br>

    case ECONNREFUSED: <br>

    case ENETUNREACH: <br>

      strcpy(buf,sys_errlist[errno]); <br>

      strcat(buf,"\r\n"); <br>

      write(usersockfd,buf,strlen(buf)); <br>

      close(usersockfd); <br>

      exit(1);  /* die peacefully if we can't establish a connection */ <br>

      break; <br>

      break; <br>

    default: <br>

      errorout("failed to connect to host"); <br>

  } <br>

  <br>

  <br>

  /* now we're connected, serve fall into the data echo loop */ <br>

  while (1) { <br>

    /* Select for readability on either of our two sockets */ <br>

    FD_ZERO(&rdfdset); <br>

    FD_SET(usersockfd,&rdfdset); <br>

    FD_SET(isosockfd,&rdfdset); <br>

    if (select(FD_SETSIZE,&rdfdset,NULL,NULL,NULL) < 0) <br>

      errorout("select failed"); <br>

  <br>

    /* is the client sending data? */ <br>

    if (FD_ISSET(usersockfd,&rdfdset)) { <br>

      if ((iolen = read(usersockfd,buf,sizeof(buf))) <= 0) <br>

        break;   /* zero length means the client disconnected */ <br>

  <br>

      write(isosockfd,buf,iolen);   /* copy to host -- blocking semantics */ <br>

    } <br>

  <br>

  <br>

    /* is the host sending data? */ <br>

    if (FD_ISSET(isosockfd,&rdfdset)) { <br>

      if ((iolen = read(isosockfd,buf,sizeof(buf))) <= 0) <br>

        break;   /* zero length means the host disconnected */ <br>

  <br>

      write(usersockfd,buf,iolen);  /* copy to client -- blocking semantics */ <br>

    } <br>

  } <br>

  <br>

  /* we're done with the sockets */ <br>

  close(isosockfd); <br>

  close(usersockfd); <br>

} <br>

  <br>

  <br>

  <br>

/**************************************************************************** <br>

  function:      errorout <br>

  description:   displays an error message on the console and kills the <br>

                 current process. <br>

  arguments: <br>

    msg          message to be displayed. <br>



  <br>

  return value:  none -- does not return. <br>

  calls:         none. <br>

  globals:       none. <br>

 ****************************************************************************/ <br>

  <br>

void errorout (msg) <br>

char *msg; <br>

{ <br>

  FILE *console; <br>

  <br>

  console = fopen("/dev/console","a"); <br>

  fprintf(console,"proxyd: %s\r\n",msg); <br>

  fclose(console); <br>

  exit(1); <br>

} <br>

  <br>

  <br>

  <br>

/**************************************************************************** <br>

  function:      reap_status <br>

  description:   handle a SIGCLD signal by reaping the exit status of the <br>



                 perished child, and discarding it. <br>

  arguments:     none. <br>

  return value:  none. <br>

  calls:         none. <br>

  globals:       none. <br>

 ****************************************************************************/ <br>

  <br>

void reap_status () <br>

{ <br>

  int pid; <br>

  union wait status; <br>

  <br>

  while ((pid = wait3(&status,WNOHANG,NULL)) > 0) <br>

    ;  /* loop while there are more dead children */ <br>

} <br>

  <br>

  <br>

-- <br>

※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.193.65.100] <br>

发信人: stwzyang (hook), 信区: Winsock <br>

标  题: About Proxy source code (转帖) <br>

发信站: BBS 水木清华站 (Sat Jan  3 04:19:25 1998) <br>



  <br>

偶在网上得此proxyd,先post出来,再慢慢研究。。。 <br>

  <br>

17 Dev 1997 <br>

  <br>

Author:         Carl Harris (ceharris@vt.edu) <br>

Compiler:       TjL <luomat@peak.org> <br>

  <br>

Compiled by: <br>

cc -O2  -object -s \ <br>

        -arch m68k -arch i386 -arch hppa -arch sparc \ <br>

        proxyd.c -o proxyd <br>

  <br>

  <br>

This is a little daemon I felt was useful and was able to compile, so I thought I would make it available. <br>

  <br>

I did not write this!  I am just compiling and distributing. The source code hadd no restrictions on doing so. <br>

  <br>

All I know as far as how to use it is what it says: <br>

  <br>

usage: proxyd <proxy-port> <host> <service-name|port-number> <br>

  <br>

  <br>

Which means: <br>

  <br>

proxyd localport-on-this-machine the-host-this-is-to  port-or-name <br>

  <br>

EXAMPLE: <br>

  <br>

Say you have a machine named MYHOST want to bind your port #777 to the TELNET poort of the host REMOTEHOST. <br>

  <br>

Use: proxyd 777 REMOTEHOST telnet <br>

  <br>

Then if you did 'telnet MYHOST 777' you would actually connect to the TELNET porrt of the host REMOTEHOST. <br>

  <br>

As far as the 'service-name/port-number' goes: services can be referred to eitheer by a number or a name.  For example, NNTP requests are usually on port 119, so if you wanted to connect directly to a machine to do NNTP y <br>

  <br>

telnet REMOTEHOST nntp <br>

        or <br>

telnet REMOTEHOST 119 <br>

  <br>

  <br>

NOTE/WARNING: Make sure to use an unused port on your machine!  If you are not ssure, do this: <br>

  <br>

 nidump services . <br>

Use: proxyd 777 REMOTEHOST telnet <br>

  <br>

Then if you did 'telnet MYHOST 777' you would actually connect to the TELNET por <br>

  <br>

As far as the 'service-name/port-number' goes: services can be referred to eithe <br>

  <br>

telnet REMOTEHOST nntp <br>

        or <br>

telnet REMOTEHOST 119 <br>

  <br>

  <br>

NOTE/WARNING: Make sure to use an unused port on your machine!  If you are not srt of the host REMOTEHOST. <br>

  <br>

 nidump services . <br>

  <br>

to see a listing of all the services known on your machine. <br>

  <br>

This program does NOT always have to be run as root... Some ports are available even to regular users, it appears. <br>

  <br>

  <br>

  <br>

-- <br>

※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.193.65.100] <br>

</small><hr>
<p align="center">[<a href="清华bbs网络资源.htm">回到开始</a>][<a href="8.htm">上一层</a>][<a href="63.htm">下一篇</a>]<p align="center" ><font face="黑体" size=5><big>网络资源大全</big></font></p> 
</table> 
</body> 
</html>

⌨️ 快捷键说明

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