📄 udps.c
字号:
/********************************************************************** * UDP僒儞僾儖僒乕僶 (udps.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/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define BUFSIZE 32768#define MSGSIZE 1024#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, DST_PORT};int execute(char *command, char *buf, int bufmax);int main(int argc, char *argv[]){ struct sockaddr_in server; /* 僒乕僶偺傾僪儗僗 */ struct sockaddr_in client; /* 僋儔僀傾儞僩偺傾僪儗僗 */ int len; /* sockaddr_in偺挿偝 */ int port; /* 僒乕僶偺億乕僩斣崋 */ int s; /* 僜働僢僩僨傿僗僋儕僾僞 */ int cn; /* 庴怣偟偨僐儅儞僪偺儚乕僪悢 */ int sn; /* 憲怣儊僢僙乕僕偺僶僀僩悢 */ int rn; /* 庴怣儊僢僙乕僕偺僶僀僩悢 */ int i; /* 儖乕僾曄悢 */ char cmd1[BUFSIZE]; /* 1儚乕僪栚偺僐儅儞僪 */ char cmd2[BUFSIZE]; /* 2儚乕僪栚偺僐儅儞僪 */ char recv_buf[BUFSIZE]; /* 庴怣僶僢僼傽 */ char send_buf[BUFSIZE]; /* 憲怣僶僢僼傽 */ /* 堷偒悢偺張棟(億乕僩斣崋) */ if (argc == 2) { if ((port = atoi(argv[DST_PORT])) == 0) { struct servent *se; /* 僒乕價僗忣曬 */ if ((se = getservbyname(argv[DST_PORT], "udp")) != NULL) port = (int) ntohs((u_int16_t) se->s_port); else { fprintf(stderr, "getservbyname error\n"); exit(EXIT_FAILURE); } } } else port = DEFAULT_PORT; /* UDP偱僜働僢僩傪僆乕僾儞偡傞 */ if ((s = socket(AF_INET, SOCK_DGRAM, 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(s, (struct sockaddr *) &server, sizeof server) < 0) { perror("bind"); exit(EXIT_FAILURE); } /* 僒乕僶張棟儊僀儞儖乕僠儞 */ while ((rn = recvfrom(s, recv_buf, BUFSIZE - 1, 0, (struct sockaddr *) &client, (len = sizeof client, &len))) >= 0) { recv_buf[rn] = '\0'; printf("receive from '%s'\n", inet_ntoa(client.sin_addr)); printf("receive data '%s'\n", recv_buf); /* 庴怣僐儅儞僪偺張棟 */ if ((cn = sscanf(recv_buf, "%s%s", cmd1, cmd2)) <= 0) sn = 0; /* continue; */ else if (cn == 2 && strcmp(cmd1, "show") == 0) { if (strcmp(cmd2, "route") == 0) sn = execute(COMMAND_ROUTE, send_buf, BUFSIZE); else if (strcmp(cmd2, "arp") == 0) sn = execute(COMMAND_ARP, send_buf, BUFSIZE); else if (strcmp(cmd2, "tcp") == 0) sn = execute(COMMAND_TCP, send_buf, BUFSIZE); else if (strcmp(cmd2, "nic") == 0) sn = execute(COMMAND_NIC, send_buf, BUFSIZE); else sn = snprintf(send_buf, BUFSIZE, "parameter error '%s'\n" "show [route|arp|tcp|nic]\n", cmd2); } else { if (strcmp(cmd1, "quit") == 0) break; send_buf[0] = '\0'; if (cn != 1 && strcmp(cmd1, "help") != 0) snprintf(send_buf, BUFSIZE, "command error '%s'\n", cmd1); strncat(send_buf, "Command:\n" " show route\n" " show arp\n" " show tcp\n" " show nic\n" " quit\n" " help\n", BUFSIZE - strlen(send_buf) - 1); sn = strlen(send_buf); } /* 儊僢僙乕僕憲怣儖乕僾 (嵟屻偵昁偢MSGSIZE枹枮偺僷働僢僩傪憲怣偡傞) */ for (i = 0; i <= sn; i += MSGSIZE) { int size; /* 憲怣偡傞儊僢僙乕僕偺僒僀僘 */ if (sn - i > MSGSIZE) size = MSGSIZE; else if (sn - i <= 0) size = 0; else size = sn; if (sendto(s,&send_buf[i],size,0,(struct sockaddr *)&client,len) < 0) { perror("sendto"); exit(EXIT_FAILURE); } } printf("%s", send_buf); } close(s); 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 + -