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

📄 62.htm

📁 网络编程原理文摘 [文件] 精华区目录结构 [目录] 网络编程的基本原理 [目录] 网络编程与网络协议 [目录] 网上资源 [目录] winsock技术 [目录
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<HTML><HEAD><TITLE>CTerm非常精华下载</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type></HEAD>
<BODY bgColor=#ffffff>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=100% background=0044.jpg>
  <BODY>
  <TR>
    <TD height=150 rowSpan=2 width="308" ><IMG alt=DDl_back.jpg height=129 width=300 src="DDl_back.jpg" ></TD>
    <TD background=DDl_back2.jpg height=50 width="581" ><BIG><BIG><FONT face=黑体>
      <P align=center >重拳出击  一网打尽</FONT></BIG></BIG></P></TD></TR>
  <TR>
    <TD bgColor=#0099ff borderColor=#0099ff height=5 width="581"></TD></TR>
  <TR>
    <TD align=middle colSpan=2 height=100 vAlign=top width="891" ><BR>
<p align=center>[<a href="清华bbs网络资源.htm">回到开始</a>][<a href="8.htm">上一层</a>][<a href="63.htm">下一篇</a>]
<hr><p align="left"><small>发信人: stwzyang (hook), 信区: Winsock <br>

标  题: Proxy source code <br>

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

  <br>

  <br>

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

  program:      proxyd <br>

  module:       proxyd.c <br>

  summary:      provides proxy tcp service for a host on an isolated network. <br>

  <br>

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

  date:         22 Feb 94 <br>

  <br>

  description: <br>

        This code implements a daemon process which listens for tcp connec- <br>

        tions on a specified port number.  When a connection is established, <br>

        a child is forked to handle the new client.  The child then estab- <br>

        lishes a tcp connection to a port on the isolated host.  The child <br>

        then falls into a loop in which it writes data to the isolated host <br>

        for the client and vice-versa.  Once a child has been forked, the <br>

        parent resumes listening for additional connections. <br>

  <br>

        The name of the isolated host and the port to serve as proxy for, <br>



        as well as the port number the server listen on are specified as <br>

        command line arguments. <br>

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

  <br>

  <br>

#include <stdio.h> <br>

#include <ctype.h> <br>

#include <errno.h> <br>

#include <signal.h> <br>

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

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

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

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

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

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

#include <netdb.h> <br>

  <br>

  <br>

#define  TCP_PROTO      "tcp" <br>

  <br>

int proxy_port;                 /* port to listen for proxy connections on */ <br>

struct sockaddr_in hostaddr;    /* host addr assembled from gethostbyname() */ <br>



  <br>

extern int errno;               /* defined by libc.a */ <br>

extern char *sys_errlist[];     /* defined by libc.a */ <br>

  <br>

  <br>

void parse_args (int argc, char **argv); <br>

void daemonize (int servfd); <br>

void do_proxy (int usersockfd); <br>

void reap_status (void); <br>

void errorout (char *msg); <br>

  <br>

  <br>

  <br>

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

  function:      main <br>

  description:   Main level driver.  After daemonizing the process, a socket <br>

                 is opened to listen for connections on the proxy port, <br>

                 connections are accepted and children are spawned to handle <br>

                 each new connection. <br>

  arguments: <br>

    argc,argv    you know what those are. <br>

  <br>

  <br>

  return value:  none. <br>

  calls:         parse_args, do_proxy. <br>

  globals:       reads proxy_port. <br>

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

  <br>

main (argc,argv) <br>

int argc; <br>

char **argv; <br>

{ <br>

  int clilen; <br>

  int childpid; <br>

  int sockfd, newsockfd; <br>

  struct sockaddr_in servaddr, cliaddr; <br>

  <br>

  parse_args(argc,argv); <br>

  <br>

  /* prepare an address struct to listen for connections */ <br>

  bzero((char *) &servaddr, sizeof(servaddr)); <br>

  servaddr.sin_family = AF_INET; <br>

  servaddr.sin_addr.s_addr = htonl(INADDR_ANY); <br>

  servaddr.sin_port = proxy_port; <br>

  <br>

  <br>

  /* get a socket... */ <br>

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

    fputs("failed to create server socket\r\n",stderr); <br>

    exit(1); <br>

  } <br>

  <br>

  /* ...and bind our address and port to it */ <br>

  if (bind(sockfd,(struct sockaddr_in *) &servaddr,sizeof(servaddr)) < 0) { <br>

    fputs("faild to bind server socket to specified port\r\n",stderr); <br>

    exit(1); <br>

  } <br>

  <br>

  /* get ready to accept with at most 5 clients waiting to connect */ <br>

  listen(sockfd,5); <br>

  <br>

  /* turn ourselves into a daemon */ <br>

  daemonize(sockfd); <br>

  <br>

  /* fall into a loop to accept new connections and spawn children */ <br>

  while (1) { <br>

  <br>

    /* accept the next connection */ <br>



    clilen = sizeof(cliaddr); <br>

    newsockfd = accept(sockfd, (struct sockaddr_in *) &cliaddr, &clilen); <br>

    if (newsockfd < 0 && errno == EINTR) <br>

      continue;    /* a signal might interrupt our accept() call */ <br>

    else if (newsockfd < 0) <br>

      /* something quite amiss -- kill the server */ <br>

      errorout("failed to accept connection"); <br>

  <br>

    /* fork a child to handle this connection */ <br>

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

      close(sockfd); <br>

      do_proxy(newsockfd); <br>

      exit(0); <br>

    } <br>

  <br>

    /* if fork() failed, the connection is silently dropped -- oops! */ <br>

  <br>

    close(newsockfd); <br>

  } <br>

} <br>

  <br>

  <br>

  <br>

  <br>

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

  function:      parse_args <br>

  description:   parse the command line args. <br>

  arguments: <br>

    argc,argv    you know what these are. <br>

  <br>

  return value:  none. <br>

  calls:         none. <br>

  globals:       writes proxy_port, writes hostaddr. <br>

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

  <br>

void parse_args (argc,argv) <br>

int argc; <br>

char **argv; <br>

{ <br>

  int i; <br>

  struct hostent *hostp; <br>

  struct servent *servp; <br>

  unsigned long inaddr; <br>

  struct { <br>

    char proxy_port [16]; <br>



    char isolated_host [64]; <br>

    char service_name [32]; <br>

  } pargs; <br>

  <br>

  <br>

  if (argc < 4) { <br>

    printf("usage:  %s <proxy-port> <host> <service-name|port-number>\r\n", <br>

           argv[0]); <br>

    exit(1); <br>

  } <br>

  <br>

  strcpy(pargs.proxy_port,argv[1]); <br>

  strcpy(pargs.isolated_host,argv[2]); <br>

  strcpy(pargs.service_name,argv[3]); <br>

  <br>

  for (i = 0;  i < strlen(pargs.proxy_port);  i++) <br>

    if (!isdigit(*(pargs.proxy_port + i))) <br>

      break; <br>

  <br>

  if (i == strlen(pargs.proxy_port)) <br>

    proxy_port = htons(atoi(pargs.proxy_port)); <br>

  else { <br>

  else { <br>

    printf("%s: invalid proxy port\r\n",pargs.proxy_port); <br>

    exit(0); <br>

  } <br>

  <br>

  bzero(&hostaddr,sizeof(hostaddr)); <br>

  hostaddr.sin_family = AF_INET; <br>

  if ((inaddr = inet_addr(pargs.isolated_host)) != INADDR_NONE) <br>

    bcopy(&inaddr,&hostaddr.sin_addr,sizeof(inaddr)); <br>

  else if ((hostp = gethostbyname(pargs.isolated_host)) != NULL) <br>

    bcopy(hostp->h_addr,&hostaddr.sin_addr,hostp->h_length); <br>

  else { <br>

    printf("%s: unknown host\r\n",pargs.isolated_host); <br>

    exit(1); <br>

  } <br>

  <br>

  if ((servp = getservbyname(pargs.service_name,TCP_PROTO)) != NULL) <br>

    hostaddr.sin_port = servp->s_port; <br>

  else if (atoi(pargs.service_name) > 0) <br>

    hostaddr.sin_port = htons(atoi(pargs.service_name)); <br>

  else { <br>

    printf("%s: invalid/unknown service name or port number\r\n", <br>

           pargs.service_name); <br>



    exit(1); <br>

  } <br>

} <br>

  <br>

  <br>

  <br>

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

  function:      daemonize <br>

  description:   detach the server process from the current context, <br>

                 creating a pristine, predictable environment in which it <br>

                 will execute. <br>

  arguments: <br>

    servfd       file descriptor in use by server. <br>

  <br>

  return value:  none. <br>

  calls:         none. <br>

  globals:       none. <br>

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

  <br>

void daemonize (servfd) <br>

int servfd; <br>

{ <br>

{ <br>

  int childpid, fd, fdtablesize; <br>

  <br>

  /* ignore terminal I/O, stop signals */ <br>

  signal(SIGTTOU,SIG_IGN); <br>

  signal(SIGTTIN,SIG_IGN); <br>

  signal(SIGTSTP,SIG_IGN); <br>

  <br>

  /* fork to put us in the background (whether or not the user <br>

     specified '&' on the command line */ <br>

⌨️ 快捷键说明

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