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

2017-2018-1 20155332实验三 实时系统报告相关推荐

  1. 2017-2018-11 20155307刘浩 20155338常胜杰 20155335俞昆 实验三 实时系统实验报告

    2017-2018-11 20155307刘浩 20155338常胜杰 20155335俞昆 实验三 实时系统 实验目的 实验一: 学习使用Linux命令wc(1) 基于Linux Socket程序设 ...

  2. 2017-2018-1 20155222实验三 实时系统

    2017-2018-1 20155222实验三 实时系统 1.学习使用Linux命令wc 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端传一个文本文 ...

  3. 2018-2019-1 20165305 实验三 实时系统

    实验三 实时系统 码云链接 实验三-并发程序-1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端传一个文本文件给服 ...

  4. 20145208 20145230 20145235 《信息安全系统设计基础》实验三 实时系统的移植

    20145208 20145230 20145235 <信息安全系统设计基础>实验三 实时系统的移植 转载于:https://www.cnblogs.com/20145235litao/p ...

  5. 2017-2018-1 20155209 实验三 实时系统

    2017-2018-1 20155209 实验三 实时系统 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端传一个文 ...

  6. 2018-2019-1 20165315 实验三 实时系统

    2018-2019-1 20165315 实验三 实时系统 任务一 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端,客户端 ...

  7. 2017-2018-1 20155223 实验三 实时系统

    2017-2018-1 20155223 实验三 实时系统 实验1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端 ...

  8. 2018-2019-1 20165219 实验三 实时系统

    2018-2019-1 20165219 实验三 实时系统 任务一 实验要求 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户 ...

  9. 2017-2018-1 20155320 实验三——实时系统

    2017-2018-1 20155320 实验三--实时系统 实验三-并发程序-1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的> ...

最新文章

  1. Project Management - 3) Manage Your Meetings
  2. 论文创新,可以看看这几篇去雨文章是怎么做的
  3. cacls文件服务器备份与恢复,实战安全设置WEB专用服务器技巧
  4. 2017蓝桥杯省赛---java---B---1(购物单)
  5. phpstrom+phpstudy+postman
  6. CLR via C# 3 读书笔记(4):第1章 CLR执行模型 — 1.4 执行程序集代码
  7. 消息称快手已通过港交所聆讯 计划2月第一周上市
  8. Linux命令之dos2unix - 将DOS格式文本文件转换成UNIX格式
  9. 【class2src】Decompiler
  10. 第三季-第18课-共享内存通讯
  11. SpringAOP原理解析
  12. 解决:Failed to create 'build\outputs\apk\watch-debug-unaligned.apks': 拒绝访问。
  13. Gambit 2.Gambit解释器
  14. 296 最佳的碰头地点
  15. 18年12月计算机英语统考成绩查询,没查的抓紧,18年12月四六级成绩查询入口将关闭...
  16. 计算机硬盘从盘的设置,双硬盘怎么设置主从盘 电脑双硬盘设置主从教程
  17. 视频中的声音如何处理,如何添加背景音乐?
  18. HTML+CSS简单漫画网页设计成品--(红猪(9页)带注释)
  19. deepin外置键盘无法打开键盘背光灯的解决方法
  20. 如何用小程序玩转裂变?你要的小程序裂变营销都在这里

热门文章

  1. GDCM:gdcm::PixelFormat的测试程序
  2. GDCM:gdcm::Unpacker12Bits的测试程序
  3. DCMTK:在OFFile类中non-trivial fseek和ftell实现的测试程序
  4. VTK:可视化算法之VelocityProfile
  5. VTK:PolyData之PolyDataToImageData
  6. OpenCV坎尼探测器Canny Detector的实例(附完整代码)
  7. OpenGL伽玛校正测试
  8. C++实现Dijkstra(迪杰斯特拉)算法(附完整源码)
  9. Ibatis动态(dynamic)查询
  10. 03_Weblogic之配置简单域:启动和配置域,使用模板创建域,使用控制台