📄 udpc.c
字号:
/********************************************************************** * UDP僒儞僾儖僋儔僀傾儞僩 (udpc.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>#include <sys/types.h>#include <sys/time.h>#define MSGSIZE 1024#define BUFSIZE (MSGSIZE + 1)#define DEFAULT_PORT 5320enum {CMD_NAME, DST_IP, DST_PORT};int main(int argc, char *argv[]){ struct sockaddr_in server; /* 僒乕僶偺傾僪儗僗 */ unsigned long dst_ip; /* 僒乕僶偺IP傾僪儗僗 */ int port; /* 億乕僩斣崋 */ int s; /* 僜働僢僩僨傿僗僋儕僾僞 */ int zero; /* 僛儘 */ /* 堷偒悢偺僠僃僢僋 */ if (argc != 2 && argc != 3) { fprintf(stderr, "Usage: %s hostname [port]\n", argv[0]); exit(EXIT_FAILURE); } /* 僒乕僶偺IP傾僪儗僗傪挷傋傞 */ if ((dst_ip = inet_addr(argv[DST_IP])) == INADDR_NONE) { struct hostent *he; /* 儂僗僩忣曬 */ if ((he = gethostbyname(argv[DST_IP])) == NULL) { fprintf(stderr, "gethostbyname error\n"); exit(EXIT_FAILURE); } memcpy((char *) &dst_ip, (char *) he->h_addr, he->h_length); } /* 僒乕僶偺億乕僩斣崋傪挷傋傞 */ if (argc == 3) { 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 = dst_ip; server.sin_port = htons(port); /* * 僋儔僀傾儞僩張棟儊僀儞儖乕僠儞 */ zero = 0; printf("UDP>"); fflush(stdout); while (1) { char buf[BUFSIZE]; /* 庴怣僶僢僼傽 */ char cmd[BUFSIZE]; /* 憲怣僶僢僼傽 */ int n; /* 擖椡僨乕僞偺僶僀僩悢 */ struct timeval tv; /* select偺僞僀儉傾僂僩帪娫 */ fd_set readfd; /* select偱専弌偡傞僨傿僗僋儕僾僞 */ /* select偺僞僀儉傾僂僩偺愝掕 */ tv.tv_sec = 600; tv.tv_usec = 0; /* select偵傛傞僀儀儞僩懸偪 */ FD_ZERO(&readfd); FD_SET(0, &readfd); /* 昗弨擖椡 */ FD_SET(s, &readfd); /* 僒乕僶 */ if ((select(s + 1, &readfd, NULL, NULL, &tv)) <= 0) { fprintf(stderr, "\nTimeout\n"); break; } /* 昗弨擖椡偐傜偺擖椡僐儅儞僪偺張棟 */ if (FD_ISSET(0, &readfd)) { if ((n = read(0, buf, BUFSIZE - 1)) <= 0) break; buf[n] = '\0'; sscanf(buf, "%s", cmd); if (strcmp(cmd, "quit") == 0) break; if (sendto(s, buf, n, 0, (struct sockaddr *) &server, sizeof server) < 0) break; } /* 僒乕僶偐傜偺墳摎儊僢僙乕僕偺張棟 */ if (FD_ISSET(s, &readfd)) { if ((n = recvfrom(s, buf, MSGSIZE, 0, (struct sockaddr *) 0, &zero)) < 0) break; buf[n] = '\0'; printf("%s", buf); if (n < MSGSIZE) printf("UDP>"); fflush(stdout); } } close(s); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -