📄 tcps.c
字号:
/********************************************************************** * TCP僒儞僾儖僒乕僶僾儘僌儔儉 (tcps.c) * Ver 2.0 2004擭 7寧 10擔 * 惂嶌丒挊嶌 懞嶳岞曐 (Yukio Murayama) * * 巊梡嫋戻彂 * 杮僾儘僌儔儉偼丄TCP/IP僾儘僩僐儖偺妛廗丄媦傃丄僱僢僩儚乕僋僾儘 * 僌儔儈儞僌偺媄擻傪岦忋偝偣傞偨傔偵偺傒丄偦偺傑傑丄傑偨偼丄廋惓 * 偟偰巊梡偡傞偙偲偑偱偒傑偡丅杮僾儘僌儔儉偵偮偄偰丄朄棩偱嬛巭偝 * 傟偰偄傞偐丄傑偨偼丄岞彉椙懎偵斀偡傞傛偆側夵憿丄媦傃丄巊梡傪嬛 * 巭偟傑偡丅杮僾儘僌儔儉偼柍曐徹偱偡丅惂嶌幰偼杮僾儘僌儔儉偵傛偭 * 偰敪惗偟偨偄偐側傞懝奞偵偮偄偰傕愑擟傪庢傞偙偲偼偱偒傑偣傫丅 **********************************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#ifdef FORK_SERVER#include <signal.h>#include <sys/wait.h>#endif#define BUFSIZE 8192#define BUFSIZE2 32768#define DEFAULT_PORT 5320/* 儖乕僥傿儞僌僥乕僽儖傪昞帵偝偣傞僐儅儞僪 */#ifdef __linux#define COMMAND_ROUTE "/bin/netstat -rn"#else#define COMMAND_ROUTE "netstat -rn"#endif/* ARP僥乕僽儖傪昞帵偝偣傞僐儅儞僪 */#ifdef __linux#define COMMAND_ARP "/sbin/arp -an"#else#define COMMAND_ARP "arp -an"#endif/* TCP僐僱僋僔儑儞僥乕僽儖傪昞帵偝偣傞僐儅儞僪 */#ifdef __linux#define COMMAND_TCP "/bin/netstat -tn"#else#define COMMAND_TCP "netstat -n"#endif/* NIC偺忣曬傪昞帵偝偣傞僐儅儞僪 */#ifdef __linux#define COMMAND_NIC "/sbin/ifconfig -a"#else#define COMMAND_NIC "ifconfig -a"#endifenum {CMD_NAME, SRC_PORT};int execute(char *command, char *buf, int bufmax);#ifdef FORK_SERVERvoid reaper(){ int status; wait(&status);}#endifint main(int argc, char *argv[]){ struct sockaddr_in server; /* 僒乕僶偺傾僪儗僗 */ struct sockaddr_in client; /* 僋儔僀傾儞僩偺傾僪儗僗 */ int len; /* sockaddr_in偺挿偝 */ int port; /* 僒乕僶偺億乕僩斣崋 */ int s; /* 儊僢僙乕僕憲庴怣梡僨傿僗僋儕僾僞 */ int s0; /* 僐僱僋僔儑儞庴偗晅偗梡僨傿僗僋儕僾僞 */ /* 堷偒悢偺張棟(億乕僩斣崋) */ if (argc == 2) { if ((port = atoi(argv[SRC_PORT])) == 0) { struct servent *se; /* 僒乕價僗忣曬 */ if ((se = getservbyname(argv[SRC_PORT], "tcp")) != NULL) port = (int) ntohs((u_int16_t) se->s_port); else { fprintf(stderr, "getservbyname error\n"); exit(EXIT_FAILURE); } } } else port = DEFAULT_PORT; /* TCP偱僜働僢僩傪僆乕僾儞偡傞 */ if ((s0 = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(EXIT_FAILURE); } /* 僒乕僶偺傾僪儗僗傪愝掕偡傞 */ memset(&server, 0, sizeof server); server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(port); if (bind(s0, (struct sockaddr *) &server, sizeof server) < 0) { perror("bind"); exit(EXIT_FAILURE); } /* 僐僱僋僔儑儞妋棫梫媮庴晅奐巒 */ if (listen(s0, 5) < 0) { perror("listen"); exit(EXIT_FAILURE); }#ifdef FORK_SERVER signal(SIGCHLD, (void *) reaper);#endif /* * 僐僱僋僔儑儞庴偗晅偗儖乕僾 */ while (1) { /* 僐僱僋僔儑儞庴晅張棟 */ len = sizeof client; if ((s = accept(s0, (struct sockaddr *) &client, &len)) < 0) { perror("accept"); exit(EXIT_FAILURE); } /* 愙懕偟偨僋儔僀傾儞僩偺IP傾僪儗僗偺昞帵 */ printf("connected from '%s'\n", inet_ntoa(client.sin_addr));#ifdef FORK_SERVER if (fork() != 0) { close(s); continue; } close(s0);#endif /* 僒乕僶張棟儊僀儞儖乕僠儞 */ while (1) { char recv_buf[BUFSIZE]; /* 庴怣僶僢僼傽 */ char cmd1[BUFSIZE]; /* 1儚乕僪栚偺僐儅儞僪 */ char cmd2[BUFSIZE]; /* 2儚乕僪栚偺僐儅儞僪 */ int cn; /* 庴怣偟偨僐儅儞僪偺儚乕僪悢 */ int i; /* 庴怣暥帤偺僇僂儞僩 */ char send_head[BUFSIZE]; /* 憲怣僨乕僞偺僿僢僟 */ char send_data[BUFSIZE2]; /* 憲怣僶僢僼傽 */ int hn; /* 憲怣僿僢僟偺僶僀僩悢 */ int dn; /* 憲怣僨乕僞偺僶僀僩悢 */ /* 僐儅儞僪偺庴怣 */ recv_buf[0] = '\0'; for (i = 0; i < BUFSIZE - 1; i++) { if (recv(s, &recv_buf[i], 1, 0) <= 0) goto exit_loop; if (recv_buf[i] == '\n') /* 夵峴扨埵偱庴怣張棟傪偡傞 */ break; } recv_buf[i] = '\0'; printf("receive '%s'\n", recv_buf); /* 庴怣僐儅儞僪偺張棟 */ if ((cn = sscanf(recv_buf, "%s%s", cmd1, cmd2)) <= 0) continue; if (cn == 2 && strcmp(cmd1, "show") == 0) { if (strcmp(cmd2, "route") == 0) dn = execute(COMMAND_ROUTE, send_data, BUFSIZE2); else if (strcmp(cmd2, "arp") == 0) dn = execute(COMMAND_ARP, send_data, BUFSIZE2); else if (strcmp(cmd2, "tcp") == 0) dn = execute(COMMAND_TCP, send_data, BUFSIZE2); else if (strcmp(cmd2, "nic") == 0) dn = execute(COMMAND_NIC, send_data, BUFSIZE2); else dn = snprintf(send_data, BUFSIZE2, "parameter error '%s'\n" "show [route|arp|tcp|nic]\n", cmd2); } else { if (strcmp(cmd1, "quit") == 0) goto exit_loop; send_data[0] = '\0'; if (cn != 1 && strcmp(cmd1, "help") != 0) snprintf(send_data, BUFSIZE2 - 1, "command error '%s'\n", cmd1); strncat(send_data, "Command:\n" " show route\n" " show arp\n" " show tcp\n" " show nic\n" " quit\n" " help\n", BUFSIZE2 - strlen(send_data) - 1); dn = strlen(send_data); } /* 傾僾儕働乕僔儑儞僿僢僟偺憲怣 */ hn = snprintf(send_head, BUFSIZE - 1, "Content-Length: %d\n\n", dn); if (send(s, send_head, hn, 0) < 0) break; send_head[hn] = '\0'; printf("%s\n", send_head); /* 傾僾儕働乕僔儑儞僨乕僞偺憲怣 */ if (send(s, send_data, dn, 0) < 0) break; printf("%s\n", send_data); } exit_loop: printf("connection closed.\n"); close(s);#ifdef FORK_SERVER return 0;#endif } close(s0); return 0;}/* * int execute(char *command, char *buf, int bufmax); * * 婡擻 * 僐儅儞僪傪幚峴偟丄弌椡寢壥傪僶僢僼傽偵奿擺偡傞 * 堷偒悢 * char *command; 幚峴偡傞僐儅儞僪 * char *buf; 弌椡寢壥傪奿擺偡傞僶僢僼傽 * int bufmax; 僶僢僼傽偺戝偒偝 * 栠傝抣 * int 僶僢僼傽偵奿擺偟偨暥帤悢 */int execute(char *command, char *buf, int bufmax){ FILE *fp; /* 僼傽僀儖億僀儞僞 */ int i; /* 擖椡偟偨僨乕僞偺僶僀僩悢 */ if ((fp = popen(command, "r")) == NULL) { perror(command); i = snprintf(buf, BUFSIZE, "server error: '%s' cannot execute.\n", command); } else { i = 0; while (i < bufmax - 1 && (buf[i] = fgetc(fp)) != EOF) i++; buf[i] = '\0'; pclose(fp); } return i;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -