📄 tcpc.c
字号:
/***************************************************************** * TCP僒儞僾儖僋儔僀傾儞僩僾儘僌儔儉 (tcpc.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>#define BUFSIZE 8192#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 n; /* 擖椡僨乕僞偺僶僀僩悢 */ int len; /* 傾僾儕働乕僔儑儞僨乕僞偺挿偝 */ char send_buf[BUFSIZE]; /* 憲怣僶僢僼傽 */ /* 堷偒悢偺僠僃僢僋 */ 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], "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 ((s = 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 = dst_ip; server.sin_port = htons(port); if (connect(s, (struct sockaddr *) &server, sizeof server) < 0) { perror("connect"); exit(EXIT_FAILURE); } printf("connected to '%s'\n", inet_ntoa(server.sin_addr)); /* * 僋儔僀傾儞僩張棟儊僀儞儖乕僠儞 */ while (1) { char cmd[BUFSIZE]; /* 擖椡僐儅儞僪偺専嵏梡 */ char recv_buf[BUFSIZE]; /* 庴怣僶僢僼傽 */ /* * 僐儅儞僪擖椡張棟丒憲怣張棟 */ printf("TCP>"); fflush(stdout); /* 僐儅儞僪偺擖椡 */ if (fgets(send_buf, BUFSIZE - 2, stdin) == NULL) break; cmd[0] = '\0'; sscanf(send_buf, "%s", cmd); if (strcmp(cmd, "quit") == 0) break; if (strcmp(cmd, "") == 0) strcpy(send_buf, "help\n");#ifdef HTTP strncat(send_buf, "Connection: keep-alive\n\n", BUFSIZE - strlen(send_buf) - 1);#endif /* 僐儅儞僪偺憲怣 */ if (send(s, send_buf, strlen(send_buf), 0) <= 0) { perror("send"); break; } /* * 傾僾儕働乕僔儑儞僿僢僟偺庴怣丒夝愅 */ len = -1; while (1) { char *cmd1; /* 僐儅儞僪偺1儚乕僪栚 */ char *cmd2; /* 僐儅儞僪偺2儚乕僪栚 */ int i; /* 庴怣暥帤偺僇僂儞僩 */ /* 僗僩儕乕儉宆儊僢僙乕僕偺庴怣張棟 */ 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; } if (i >= 1 && recv_buf[i - 1] == '\r') /* 夵峴偑CR丄LF偺帪偺張棟 */ i--; if (i == 0) /* 嬻峴偺応崌偼丄僿僢僟偑廔傢傝丄僨乕僞晹偑巒傑傞 */ break; /* 僿僢僟偺夝愅張棟 */ recv_buf[i] = '\0'; cmd1 = strtok(recv_buf, ": "); cmd2 = strtok(NULL, " \0");#ifdef DEBUG printf("[%s, %s]\n", cmd1, cmd2);#endif if (strcmp("Content-Length", cmd1) == 0) len = atoi(cmd2); }#ifdef HTTP if (len == -1) { while ((n = recv(s, recv_buf, BUFSIZE - 1, 0)) > 0) { recv_buf[n] = '\0'; printf("%s", recv_buf); fflush(stdout); } close(s); return 0; }#endif /* * 傾僾儕働乕僔儑儞僨乕僞偺庴怣丄夋柺傊偺弌椡 */ while (len > 0) { if ((n = recv(s, recv_buf, BUFSIZE - 1, 0)) <= 0) goto exit_loop; recv_buf[n] = '\0'; len -= n; printf("%s", recv_buf); fflush(stdout); } } exit_loop: n = snprintf(send_buf, BUFSIZE, "quit\n"); send(s, send_buf, n, 0); close(s); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -