2017-2018-1 20155332实验三 实时系统报告
生活随笔
收集整理的這篇文章主要介紹了
2017-2018-1 20155332实验三 实时系统报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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 10000000int 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為filenamechar *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 512void 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);}// 關閉監聽用的socketclose(server_socket_fd);return 0;}任務二
使用多線程實現wc服務器并使用同步互斥機制保證計數正確
對比單線程版本的性能,并分析原因
轉載于:https://www.cnblogs.com/besti2015/p/7862921.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的2017-2018-1 20155332实验三 实时系统报告的全部內容,希望文章能夠幫你解決所遇到的問題。