都是最简单的用来记忆。
this is my 的git地址:https://github.com/yanjinyun/cLanguageTcpUdp
tcp最简单的服务器:
int main(int argc, const char *argv[]) { int listenfd, acceptfd; struct sockaddr_in sin, cin; socklen_t clen; char buf[1024]; signal(SIGCHLD, SIG_IGN); listenfd = socket(PF_INET, SOCK_STREAM, 0); sin.sin_family = PF_INET; sin.sin_port = htons(atoi(argv[2])); sin.sin_addr.s_addr = inet_addr(argv[1]); bind(listenfd, (struct sockaddr *)&sin, sizeof(sin)); listen(listenfd, 5); while(1) { clen = sizeof(cin); printf("listen ......\n"); acceptfd = accept(listenfd, (struct sockaddr *)&cin, &clen); printf("client %s %d connect\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port)); if(fork() == 0) { close(listenfd); while(1) { bzero(buf, sizeof(buf)); if(recv(acceptfd, buf, sizeof(buf), 0) == 0) { printf("client %s %d exit\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port)); exit(0); } printf("recv(%s %d): %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf); } } close(acceptfd); } return 0; }
tcp最简单的客户端:
int main(int argc, const char *argv[]) { int cfd = socket(PF_INET, SOCK_STREAM, 0); struct sockaddr_in cin; char buf[1024]; cin.sin_family = PF_INET; cin.sin_port = htons(atoi(argv[2])); cin.sin_addr.s_addr = inet_addr(argv[1]); connect(cfd, (struct sockaddr *)&cin, sizeof(cin)); printf("connect ip(%s) port(%s) server ok\n", argv[1], argv[2]); if(fork() == 0) { while(1) { bzero(buf, sizeof(buf)); recv(cfd, buf, sizeof(buf), 0); printf("recv: %s\n", buf); } } while(1) { fgets(buf, sizeof(buf), stdin); buf[strlen(buf)-1] = ‘\0‘; send(cfd, buf, strlen(buf)+1, 0); } return 0; }
udp的最简单的服务器:
int main(int argc, const char *argv[]) { int sfd; struct sockaddr_in sin, cin; char buf1[1024], buf2[1024], buf3[1024]; socklen_t clen; sfd = socket(PF_INET, SOCK_DGRAM, 0); sin.sin_family = PF_INET; sin.sin_port = htons(atoi(argv[2])); sin.sin_addr.s_addr = inet_addr(argv[1]); bind(sfd, (struct sockaddr *)&sin, sizeof(sin)); if(fork() == 0) { while(1) { clen = sizeof(cin); bzero(buf1, sizeof(buf1)); recvfrom(sfd, buf1, sizeof(buf1), 0, (struct sockaddr *)&cin, &clen); printf("recvfrom: %s %d %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf1); } } while(1) { fscanf(stdin, "%s%s%s", buf1, buf2, buf3); cin.sin_family = PF_INET; cin.sin_port = htons(atoi(buf2)); cin.sin_addr.s_addr = inet_addr(buf1); sendto(sfd, buf3, strlen(buf3)+1, 0, (struct sockaddr *)&cin, sizeof(cin)); } return 0; }
udp最简单的客户端:
int main(int argc, const char *argv[]) { int sfd; struct sockaddr_in cin; char buf1[1024], buf2[1024], buf3[1024]; socklen_t clen; sfd = socket(PF_INET, SOCK_DGRAM, 0); if(fork() == 0) { while(1) { clen = sizeof(cin); bzero(buf1, sizeof(buf1)); recvfrom(sfd, buf1, sizeof(buf1), 0, (struct sockaddr *)&cin, &clen); printf("recvfrom: %s %d %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf1); } } while(1) { fscanf(stdin, "%s%s%s", buf1, buf2, buf3); cin.sin_family = PF_INET; cin.sin_port = htons(atoi(buf2)); cin.sin_addr.s_addr = inet_addr(buf1); sendto(sfd, buf3, strlen(buf3)+1, 0, (struct sockaddr *)&cin, sizeof(cin)); } return 0; }
ftp最简单的服务器器:
#define N 256 void list(int connectfd) { DIR *dir; struct dirent *d; char buf[N]; if((dir=opendir((const char *)get_current_dir_name())) == NULL) { perror("opendir"); exit(1); } while((d=readdir(dir)) != NULL) { if(d->d_name[0] == ‘.‘) { continue; } strcpy(buf, d->d_name); send(connectfd, buf, N, 0); } closedir(dir); } void get(int connectfd, char *filename) { char buf[N]; FILE *fp; int n; if((fp=fopen(filename, "r")) == NULL) { strcpy(buf, "no"); send(connectfd, buf, sizeof(buf), 0); } strcpy(buf, "yes"); send(connectfd, buf, sizeof(buf), 0); while((n=fread(buf, 1, sizeof(buf), fp)) > 0) { send(connectfd, buf, n, 0); } fclose(fp); } void put(int connectfd, char *filename) { char buf[N]; FILE *fp; int n; if((fp=fopen(filename, "r")) == NULL) { strcpy(buf, "no"); send(connectfd, buf, sizeof(buf), 0); fp = fopen(filename, "w"); while((n=recv(connectfd, buf, sizeof(buf), 0)) > 0) { fwrite(buf, 1, n, fp); } fclose(fp); return; } strcpy(buf, "yes"); send(connectfd, buf, sizeof(buf), 0); } int main(int argc, const char *argv[]) { FILE *fp; int n, listenfd, connectfd, i; struct sockaddr_in s, c; struct servent *sport; socklen_t clen; char *linep = NULL, buf[N], *arg[32]; signal(SIGCHLD, SIG_IGN); if((fp=fopen("/etc/ftp.conf", "r")) == NULL) { perror("fopen"); exit(1); } if(getline(&linep, &n, fp) == -1) { perror("getline"); exit(0); } linep[strlen(linep)-1] = ‘\0‘; chdir(linep); if((sport=getservbyname("myftp", "tcp")) == NULL) { perror("getservbyname"); exit(1); } #ifdef DEBUG printf("%d %s\n", n, linep); #endif if((listenfd=socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } s.sin_family = PF_INET; s.sin_port = sport->s_port; s.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(listenfd, (struct sockaddr *)&s, sizeof(s)) == -1) { perror("bind"); exit(1); } listen(listenfd, 5); while(1) { clen = sizeof(c); if((connectfd=accept(listenfd, (struct sockaddr *)&c, &clen)) == -1) { perror("accept"); exit(1); } if(fork() == 0) { close(listenfd); recv(connectfd, buf, sizeof(buf), 0); arg[0] = strtok(buf, " "); for(i=1; arg[i-1]!=NULL; i++) { arg[i]=strtok(NULL, " "); } if(strcmp(arg[0], "list") == 0) { list(connectfd); } if(strcmp(arg[0], "get") == 0) { get(connectfd, arg[1]); } if(strcmp(arg[0], "put") == 0) { put(connectfd, arg[1]); } close(connectfd); exit(0); } close(connectfd); } }
ftp最简单的客户端器:
#define N 256 void list(int connectfd) { DIR *dir; struct dirent *d; char buf[N]; if((dir=opendir((const char *)get_current_dir_name())) == NULL) { perror("opendir"); exit(1); } while((d=readdir(dir)) != NULL) { if(d->d_name[0] == ‘.‘) { continue; } strcpy(buf, d->d_name); send(connectfd, buf, N, 0); } closedir(dir); } void get(int connectfd, char *filename) { char buf[N]; FILE *fp; int n; if((fp=fopen(filename, "r")) == NULL) { strcpy(buf, "no"); send(connectfd, buf, sizeof(buf), 0); } strcpy(buf, "yes"); send(connectfd, buf, sizeof(buf), 0); while((n=fread(buf, 1, sizeof(buf), fp)) > 0) { send(connectfd, buf, n, 0); } fclose(fp); } void put(int connectfd, char *filename) { char buf[N]; FILE *fp; int n; if((fp=fopen(filename, "r")) == NULL) { strcpy(buf, "no"); send(connectfd, buf, sizeof(buf), 0); fp = fopen(filename, "w"); while((n=recv(connectfd, buf, sizeof(buf), 0)) > 0) { fwrite(buf, 1, n, fp); } fclose(fp); return; } strcpy(buf, "yes"); send(connectfd, buf, sizeof(buf), 0); } int main(int argc, const char *argv[]) { FILE *fp; int n, listenfd, connectfd, i; struct sockaddr_in s, c; struct servent *sport; socklen_t clen; char *linep = NULL, buf[N], *arg[32]; signal(SIGCHLD, SIG_IGN); if((fp=fopen("/etc/ftp.conf", "r")) == NULL) { perror("fopen"); exit(1); } if(getline(&linep, &n, fp) == -1) { perror("getline"); exit(0); } linep[strlen(linep)-1] = ‘\0‘; chdir(linep); if((sport=getservbyname("myftp", "tcp")) == NULL) { perror("getservbyname"); exit(1); } #ifdef DEBUG printf("%d %s\n", n, linep); #endif if((listenfd=socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } s.sin_family = PF_INET; s.sin_port = sport->s_port; s.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(listenfd, (struct sockaddr *)&s, sizeof(s)) == -1) { perror("bind"); exit(1); } listen(listenfd, 5); while(1) { clen = sizeof(c); if((connectfd=accept(listenfd, (struct sockaddr *)&c, &clen)) == -1) { perror("accept"); exit(1); } if(fork() == 0) { close(listenfd); recv(connectfd, buf, sizeof(buf), 0); arg[0] = strtok(buf, " "); for(i=1; arg[i-1]!=NULL; i++) { arg[i]=strtok(NULL, " "); } if(strcmp(arg[0], "list") == 0) { list(connectfd); } if(strcmp(arg[0], "get") == 0) { get(connectfd, arg[1]); } if(strcmp(arg[0], "put") == 0) { put(connectfd, arg[1]); } close(connectfd); exit(0); } close(connectfd); } }
时间: 2024-12-21 22:02:13