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