日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

2017-2018-1 20155332实验三 实时系统报告

發布時間:2024/9/21 windows 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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服務器并使用同步互斥機制保證計數正確
對比單線程版本的性能,并分析原因

#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 10240int 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[n] = '\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 100int 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; }

轉載于:https://www.cnblogs.com/besti2015/p/7862921.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的2017-2018-1 20155332实验三 实时系统报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。