www.pudn.com > tcpv6s.rar > tcpv6s.c


#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
 
#define BUFSIZE      8192 
#define DEFAULT_PORT 5320 
#define CMAX         256 
 
enum {CMD_NAME, SRC_PORT}; 
 
int execute(char *command, char *buf, int bufmax); 
 
int main(int argc, char *argv[]) 
{ 
  struct sockaddr_in6 server; /* Aᄍ}                  */ 
  struct sockaddr_in6 client; /* Ⱥݧ}                    */ 
  int len;                    /* sock_addrc          */ 
  int port;                   /* AᄍA                */ 
  int s;                      /* Hδyz          */ 
  int s0;                     /* δyz          */ 
  int cn;                     /* Or(word)      */ 
  int sn;                     /* eHr        */ 
  int rn;                     /* Hr        */ 
  char cmd1[BUFSIZE];         /* Ĥ@rO            */ 
  char cmd2[BUFSIZE];         /* ĤGrO            */ 
  char recv_buf[BUFSIZE];     /* GL                  */ 
  char send_buf[BUFSIZE];     /* eGL                  */ 
  char ipv6[CMAX];            /* sɩ҃ӆ^IPa}r   */ 
 
  /* ۍ@۪zz]A^ */ 
  if (argc == 2) { 
    if ((port = atoi(argv[SRC_PORT])) == 0) { 
      struct servent *se;     /* AH */ 
 
      if ((se = getservbyname(argv[SRC_PORT], "tcp")) != NULL) 
        port = (int)ntohs((u_short)se->s_port); 
      else { 
        fprintf(stderr, "getservbyname error\n"); 
        exit(EXIT_FAILURE); 
      } 
    } 
  } else 
    port = DEFAULT_PORT; 
 
  /* TCP{ɭ */ 
  if ((s0 = socket(AF_INET6, SOCK_STREAM, 0)) < 0) { 
    perror("socket"); 
    exit(EXIT_FAILURE); 
  } 
 
  /* mAᄍ} */ 
  memset((char *) &server, 0, sizeof(server)); 
  server.sin6_family = AF_INET6; 
  server.sin6_port   = htons(port); 
  if (bind(s0, (struct sockaddr *) &server, sizeof(server)) < 0) { 
    perror("bind"); 
    exit(EXIT_FAILURE); 
  } 
 
  /* {l̥߄nD */ 
  listen(s0, 5); 
 
  /* ^ */ 
  while (1) { 
    /* zz */ 
    len = sizeof(client); 
    if ((s = accept(s0, (struct sockaddr *) &client, &len)) < 0) { 
      perror("accept"); 
      exit(EXIT_FAILURE); 
    } 
 
    printf("connected from '%s'\n", inet_ntop(AF_INET6, &(client.sin6_addr), 
           ipv6, CMAX)); 
 
#ifdef FORK_SERVER 
    if (fork() != 0) { 
      close(s); 
      continue; 
    } 
    close(s0); 
#endif 
    /* AᄍzzD` */ 
    while (1) { 
      int i = 0;    /* ry */ 
 
      sn = sprintf(send_buf, "TCP(IPv6)> "); 
      send(s, send_buf, sn, 0); 
 
  receive:  /* yVƪzz */ 
      if ((rn = recv(s, &recv_buf[i], 1, 0)) < 0) 
        break; 
 
      /* Ѳ(line feed)˦zz */ 
      if (recv_buf[i] != '\n') { 
        i++; 
        if (i < BUFSIZE - 1) 
          goto receive; 
      } 
      recv_buf[i] = '\0'; 
      printf("receive '%s'\n", recv_buf); 
 
      /* Ozz */ 
      if ((cn = sscanf(recv_buf, "%s%s", cmd1, cmd2)) <= 0) 
        continue; 
      else if (cn == 2 && strcmp(cmd1, "show") == 0) { 
        if (strcmp(cmd2, "route") == 0) 
#ifdef __linux 
          sn = execute("/bin/netstat -rn",     send_buf, BUFSIZE); 
#else 
          sn = execute("/usr/bin/netstat -rn", send_buf, BUFSIZE); 
#endif 
      else if (strcmp(cmd2, "arp")== 0)  
#ifdef __linux 
        sn = execute("/sbin/arp -an",        send_buf, BUFSIZE); 
#else 
        sn = execute("/usr/sbin/arp -an",    send_buf, BUFSIZE); 
#endif 
      else if (strcmp(cmd2, "tcp") == 0) 
#ifdef __linux 
        sn = execute("/bin/netstat -tn",     send_buf, BUFSIZE); 
#else 
        sn = execute("/usr/bin/netstat -tn", send_buf, BUFSIZE); 
#endif 
      else if (strcmp(cmd2, "nic") == 0) 
        sn = execute("/sbin/ifconfig -a",    send_buf, BUFSIZE); 
      else 
        sn = sprintf(send_buf, "parameter error '%s'\n" 
                               "show [route|arp|tcp|nic]\n", cmd2); 
    } else if (cn == 1) { 
      if (strcmp(cmd1, "quit") == 0) 
        break; 
      send_buf[0] = '\0'; 
      if (strcmp(cmd1, "help") != 0) 
        sprintf(send_buf, "command error '%s'\n", cmd1); 
        strcat(send_buf, "Command:\n" 
                         "  show route\n" 
                         "  show arp\n" 
                         "  show tcp\n" 
                         "  show nic\n" 
                         "  quit\n" 
                         "  help\n"); 
        sn = strlen(send_buf); 
      } else 
        sn = sprintf(send_buf, "command error '%s'\n", cmd1); 
 
      if (sn == 0) 
        sn = sprintf(send_buf, "\n"); 
 
      if (send(s, send_buf, sn, 0) < 0) 
        break; 
      printf("%s", send_buf); 
    } 
    printf("connection closed.\n"); 
    close(s); 
  } 
  close(s0); 
 
  return EXIT_SUCCESS; 
} 
 
/* 
 * int execute(char *command, char *buf, int bufmax); 
 *  
 
 * \ 
 *     OAsɉrXCG_GLX 
 * ۍ@  
 *     char *command;  O 
 *     char *buf;      sɉrXCGGL 
 *     int bufmax;     GLjp 
 * e 
 *     int             sɤ_GLr 
 */ 
int execute(char *command, char *buf, int bufmax) 
{ 
  FILE *fp; /*  */ 
  int i;    /* ҉rJVƪr */ 
 
  if ((fp = popen(command, "r")) == NULL) { 
    perror(command); 
    i = sprintf(buf, "server error: '%s' cannot execute.\n", command); 
  } else { 
    i = 0; 
    while ((buf[i] = fgetc(fp)) != EOF && i < bufmax - 1) 
      i++; 
 
    pclose(fp); 
  } 
  return i; 
}