2017-2018-1 20155332实验三 实时系统报告
2017-11-19 23:16
627 查看
20155332 实验三
任务一:
1.学习使用Linux命令wc(1) 2.基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 3.客户端传一个文本文件给服务器 4.服务器返加文本文件中的单词数
客户端
#include<netinet/in.h> #include<sys/types.h> #include<sys/socket.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #define SERVER_PORT 5201 #define LENGTH_OF_LISTEN_QUEUE 20 #define BUFFER_SIZE 1024 #define FILE_NAME_MAX_SIZE 512 #define MAX 10000000 int main(void) { // 声明并初始化一个服务器端的socket地址结构 struct sockaddr_in server_addr; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htons(INADDR_ANY); server_addr.sin_port = htons(SERVER_PORT); // 创建socket,若成功,返回socket描述符 int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0); if(server_socket_fd < 0) { perror("Create Socket Failed:"); exit(1); } int opt = 1; setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); // 绑定socket和socket地址结构 if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)))) { perror("Server Bind Failed:"); exit(1); } // socket监听 if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE))) { perror("Server Listen Failed:"); exit(1); } while(1) { // 定义客户端的socket地址结构 struct sockaddr_in client_addr; socklen_t client_addr_length = sizeof(client_addr); // 接受连接请求,返回一个新的socket(描述符),这个新socket用于同连接的客户端通信 // accept函数会把连接到的客户端信息写到client_addr中 int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length); if(new_server_socket_fd < 0) { perror("Server Accept Failed:"); break; } // recv函数接收数据到缓冲区buffer中 char buffer[BUFFER_SIZE]; bzero(buffer, BUFFER_SIZE); if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) < 0) { perror("Server Recieve Data Failed:"); break; } // 然后从buffer(缓冲区)拷贝到file_name中 char file_name[FILE_NAME_MAX_SIZE+1]; bzero(file_name, FILE_NAME_MAX_SIZE+1); strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer)); printf("%s\n", file_name); // 打开文件并读取文件数据 FILE *fp = fopen(file_name, "r"); if(NULL == fp) { printf("File:%s Not Found\n", file_name); } else { printf("buffer:%s\n",buffer);//buffer为filename char *argv[]={"wc","-w",file_name,0}; execvp( "wc" ,argv); fclose(fp); } // 关闭与客户端的连接 close(new_server_socket_fd); } // 关闭监听用的socket close(server_socket_fd); return 0; }
服务器
#include<netinet/in.h> // sockaddr_in #include<sys/types.h> // socket #include<sys/socket.h> // socket #include<stdio.h> // printf #include<stdlib.h> // exit #include<string.h> // bzero #define SERVER_PORT 8000 #define LENGTH_OF_LISTEN_QUEUE 20 #define BUFFER_SIZE 1024 #define FILE_NAME_MAX_SIZE 512 void itoa(int i,char* string) { int power,j; j=i; for(power=1;j>=10;j/=10) power*=10; for(;power>0;power/=10) { *string++='0'+i/power; i%=power; } *string='\0'; } int main(void) { // 声明并初始化一个服务器端的socket地址结构 struct sockaddr_in server_addr; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htons(INADDR_ANY); server_addr.sin_port = htons(SERVER_PORT); // 创建socket,若成功,返回socket描述符 int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0); if(server_socket_fd < 0) { perror("Create Socket Failed:"); exit(1); } int opt = 1; setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); // 绑定socket和socket地址结构 if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)))) { perror("Server Bind Failed:"); exit(1); } // socket监听 if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE))) { perror("Server Listen Failed:"); exit(1); } while(1) { // 定义客户端的socket地址结构 struct sockaddr_in client_addr; socklen_t client_addr_length = sizeof(client_addr); // 接受连接请求,返回一个新的socket(描述符),这个新socket用于同连接的客户端通信 // accept函数会把连接到的客户端信息写到client_addr中 int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length); if(new_server_socket_fd < 0) { perror("Server Accept Failed:"); break; } // recv函数接收数据到缓冲区buffer中 char buffer[BUFFER_SIZE]; bzero(buffer, BUFFER_SIZE); if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) < 0) { perror("Server Recieve Data Failed:"); break; } // 然后从buffer(缓冲区)拷贝到file_name中 char file_name[FILE_NAME_MAX_SIZE+1]; bzero(file_name, FILE_NAME_MAX_SIZE+1); strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer)); printf("%s\n", file_name); // 打开文件并读取文件数据 FILE *fp = fopen(file_name, "w"); if(NULL == fp) { printf("File:%s Not Found\n", file_name); } else { bzero(buffer, BUFFER_SIZE); int length = 0; // 每读取一段数据,便将其发送给客户端,循环直到文件读完为止 char*ch="bye"; while((length = recv(new_server_socket_fd, buffer, 1024, 0)) > 0) { if(strcmp(buffer,ch)==0)break; if(fwrite(buffer, sizeof(char), length, fp) < length) { printf("File:\t%s Write Failed\n", file_name); break; } bzero(buffer, BUFFER_SIZE); }fclose(fp); int count=0; char s[21]; FILE *fp1; if((fp1=fopen(file_name,"r"))==NULL){ printf("Open the file failure...\n"); exit(0); } while(fscanf(fp,"%s",s)!=EOF) count++; fclose(fp1); itoa(count,buffer); printf("There is(are) %s word(s) in the text.\n",buffer); // 关闭文件 send(new_server_socket_fd, buffer, strlen(buffer), 0); printf("File:%s Transfer Successful!\n", file_name); } // 关闭与客户端的连接 close(new_server_socket_fd); } // 关闭监听用的socket close(server_socket_fd); return 0; }
任务二
使用多线程实现wc服务器并使用同步互斥机制保证计数正确
对比单线程版本的性能,并分析原因
#include <sys/time.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define BACKLOG 1 #define MAXRECVLEN 10240 int main(int argc, char *argv[]) { char buf[MAXRECVLEN]; int listenfd, connectfd; int port; struct sockaddr_in server; struct sockaddr_in client; socklen_t addrlen; if (argc != 2) { fprintf(stderr, "usage: %s <port>\n", argv[0]); exit(0); } port = atoi(argv[1]); if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket() error. Failed to initiate a socket"); exit(1); } int opt = SO_REUSEADDR; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); bzero(&server, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(port); server.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(listenfd, (struct sockaddr *)&server, sizeof(server)) == -1) { /* handle exception */ perror("Bind() error."); exit(1); } if(listen(listenfd, BACKLOG) == -1) { perror("listen() error. \n"); exit(1); } addrlen = sizeof(client); while(1){ if((connectfd=accept(listenfd,(struct sockaddr *)&client, &addrlen))==-1) { perror("accept() error. \n"); exit(1); } FILE *stream; struct timeval tv; gettimeofday(&tv, NULL); printf("You got a connection from client's ip %s, port %d ",inet_ntoa(client.sin_addr),port); int iret=-1; char d[10240]; iret = recv(connectfd, buf, MAXRECVLEN, 0); if(iret>0) { strcpy(d,buf); stream = fopen(buf,"r"); bzero(buf, sizeof(buf)); strcat(buf,"单词数:"); char s[21]; long int count = 0; while(fscanf(stream,"%s",s)!=EOF) count++; char str[10]; sprintf(str, "%ld", count); int n = sizeof(str); str = '\0'; strcat(buf,str); strcat(buf,"\n"); }else { close(connectfd); break; } send(connectfd, buf, iret, 0); close(listenfd); return 0; } #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #define MAXDATASIZE 100 int main(int argc, char *argv[]) { int sockfd, num; int port; char buf[MAXDATASIZE]; struct hostent *he; if (argc != 4) { printf("Usage: %s <PORT><IP Address><Filename>\n",argv[0]); exit(1); } port = atoi(argv[1]); if((he=gethostbyname(argv[2]))==NULL) { printf("gethostbyname() error\n"); exit(1); } if((sockfd=socket(AF_INET,SOCK_STREAM, 0))==-1) { printf("socket() error\n"); exit(1); } bzero(&server,sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(port); server.sin_addr = *((struct in_addr *)he->h_addr); if(connect(sockfd, (struct sockaddr *)&server, sizeof(server))==-1) { printf("connect() error\n"); exit(1); } char str[MAXDATASIZE] ; strcpy(str,argv[3]); if((num=send(sockfd,str,sizeof(str),0))==-1){ printf("send() error\n"); exit(1); } if((num=recv(sockfd,buf,MAXDATASIZE,0))==-1) { printf("recv() error\n"); exit(1); } buf[num-1]='\0'; printf("%s",buf); close(sockfd); return 0; }
相关文章推荐
- 2017-2018-1 20155213陆忠民 实验三 实时系统报告
- 2017-2018-11 20155307刘浩 20155338常胜杰 20155335俞昆 实验三 实时系统实验报告
- 2017-2018-1 20155328 实验三 实时系统 实验报告
- 2017-2018-1 20155318 实验三 实时系统报告
- 2017-2018-1 20155317实验三 实时系统报告
- 20155226 2017-2018-1 《信息安全系统设计基础》实验三报告
- 2017-2018-1 20155220 实验三 实时系统
- 2017-2018-1 20155201 《信息安全系统设计基础》实验三 实时系统
- 2017-2018-1 20155305实验三 实时系统
- 2017-2018-1 20155227 实验三 实时系统
- 2017-2018-1 20155315 《信息安全系统设计基础》实验三 实时系统
- 2017-2018-1 20155338 20155307 20155335实验三 实时系统
- 2017-2018-1 20155234 实验三 实时系统及mypwd实现
- 2017-2018-1 20155337 《信息安全系统设计基础》实验三——实时系统
- 2017-2018-1 20155226 实验三 实时系统
- 2017-2018-1 20155331+20155336《信息安全系统设计基础》实验一报告
- 2017-2018-1 20155212 实验三 实时系统
- 2017-2018-1 20155235 实验三 实时系统 实验内容
- 2017-2018-1 20155329 实验三 实时系统
- 2017-2018-1 20155205 实验三 实时系统