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

学习使用Linux命令wc(1)

基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端
客户端传一个文本文件给服务器
服务器返加文本文件中的单词数

  • 使用man 1 wc查看wc
  • 代码实现如下:
  • 客户端
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>#define RIO_BUFSIZE 8192typedef struct{int rio_fd;int rio_cnt;char *rio_bufptr;char rio_buf[RIO_BUFSIZE];}rio_t;#define MAXLINE 200int main(int argc,char **argv){int clientfd,port;char *host,buf[MAXLINE];char sbuf[MAXLINE];char rbuf[MAXLINE];rio_t rio;char str1[MAXLINE]="客户端IP:";char str2[MAXLINE]="服务器实现者学号:20155209”;char str3[MAXLINE]="当地时间:";FILE *fp;char filename[MAXLINE];if(argc!=3){fprintf(stderr,"usage:%s <host> <port>\n",argv[0]);exit(0);}host = argv[1];port = atoi(argv[2]);clientfd = open_clientfd(host,port);while(1){printf("输入文件名(.txt):\n");gets(filename);fp = fopen(filename,"rb");while(!feof(fp)){fgets(sbuf,MAXLINE,fp);send(clientfd,sbuf,MAXLINE,0);bzero(sbuf,sizeof(sbuf));       }printf("%s",str1);puts(host);printf("%s",str2);putchar('\n');//printf("%s",str3);//puts(rbuf);fclose(fp);//sleep(1000);//recv(clientfd,rbuf,MAXLINE,0);//printf("传输完成,该文件单词数为%s\n!",rbuf);//puts(rbuf);close(clientfd);exit(0);}}
  • 服务器

#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>#define MAXLINE 200
#define RIO_BUFSIZE 8192typedef struct{int rio_fd;int rio_cnt;char *rio_bufptr;char rio_buf[RIO_BUFSIZE];}rio_t;typedef struct sockaddr SA;typedef struct{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
}tm;void sigchld_handler(int sig){pid_t pid;int stat;while((pid = waitpid(-1,&stat,WNOHANG))>0){printf("child %d terminated\n",pid);}return;
}void itoa (int n,char s[])
{int i,j,sign;char temp[MAXLINE];if((sign=n)<0)//记录符号n=-n;//使n成为正数i=0;do{temp[i++]=n%10+'0';//取下一个数字}while ((n/=10)>0);//删除该数字if(sign<0)temp[i++]='-';for(j=0;j<i;j++){//生成的数字是逆序的,所以要逆序输出s[j] = temp[i-j-1];}s[i] = '\0';
} int main(int argc,char **argv){int count=0,cnt=0,listenfd,connfd,port,clientlen;struct sockaddr_in clientaddr;struct hostent *hp;char *haddrp;char sbuf[MAXLINE];// char *bufp = sbuf;char rbuf[MAXLINE];rio_t rio;time_t lt;tm *local;char str1[MAXLINE]="客户端IP:";char str2[MAXLINE]="服务器实现者学号:";char str3[MAXLINE]="当地时间:";FILE *fp = fopen("test.txt","wb");if(argc != 2){fprintf(stderr,"usage:%s <port>\n",argv[0]);exit(0);}port = atoi(argv[1]);signal(SIGCHLD,sigchld_handler);listenfd = open_listenfd(port);while(1){clientlen = sizeof(clientaddr);connfd = accept(listenfd,(SA *)&clientaddr,&clientlen);hp = gethostbyaddr((const char*)&clientaddr.sin_addr.s_addr,sizeof(clientaddr.sin_addr.s_addr),AF_INET);haddrp = inet_ntoa(clientaddr.sin_addr);printf("server connected to %s (%s)\n",hp->h_name,haddrp);if(fork() == 0){close(listenfd);/*lt = time(NULL); local = localtime(&lt);strftime(sbuf,64,"%Y-%m-%d %H:%M:%S",local);*/while(cnt = recv(connfd,rbuf,MAXLINE,0)){//printf("%d\n",recv(connfd,rbuf,MAXLINE,0));   fputs(rbuf,fp);bzero(rbuf,sizeof(rbuf));count += cnt;}//printf("传输成功!,该文件单词数共%d\n!",count);fclose(fp);itoa(count,sbuf);//send(connfd,sbuf,MAXLINE,0);printf("该文件单词数为%s!\n",sbuf);close(connfd);exit(0);}close(connfd);}
}
  • 实现截图:

使用多线程实现wc服务器并使用同步互斥机制保证计数正确

上方提交代码
下方提交测试
对比单线程版本的性能,并分析原因

  • 代码实现如下:
  • 客户端

#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>#define RIO_BUFSIZE 8192typedef struct{int rio_fd;int rio_cnt;char *rio_bufptr;char rio_buf[RIO_BUFSIZE];}rio_t;#define MAXLINE 200int main(int argc,char **argv){int clientfd,port;char *host,buf[MAXLINE];char sbuf[MAXLINE];char rbuf[MAXLINE];rio_t rio;char str1[MAXLINE]="客户端IP:";char str2[MAXLINE]="服务器实现者学号:20155209”;char str3[MAXLINE]="当地时间:";FILE *fp;char filename[MAXLINE];if(argc!=3){fprintf(stderr,"usage:%s <host> <port>\n",argv[0]);exit(0);}host = argv[1];port = atoi(argv[2]);clientfd = open_clientfd(host,port);while(1){printf("输入文件名(.txt):\n");gets(filename);fp = fopen(filename,"rb");while(!feof(fp)){fgets(sbuf,MAXLINE,fp);send(clientfd,sbuf,MAXLINE,0);bzero(sbuf,sizeof(sbuf));       }printf("%s",str1);puts(host);printf("%s",str2);putchar('\n');//printf("%s",str3);//puts(rbuf);fclose(fp);//sleep(1000);//recv(clientfd,rbuf,MAXLINE,0);//printf("传输完成,该文件单词数为%s\n!",rbuf);//puts(rbuf);close(clientfd);exit(0);}}
  • 服务器
#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <pthread.h>#define MAXLINE 200
#define RIO_BUFSIZE 8192typedef struct{int rio_fd;int rio_cnt;char *rio_bufptr;char rio_buf[RIO_BUFSIZE];}rio_t;typedef struct sockaddr SA;typedef struct{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
}tm;void itoa (int n,char s[]);void *thread(void *vargp);int main(int argc,char **argv){int listenfd,*connfdp,port;int clientlen;struct sockaddr_in clientaddr;struct hostent *hp;char *haddrp;pthread_t tid;if(argc != 2){fprintf(stderr,"usage:%s <port>\n",argv[0]);exit(0);}port = atoi(argv[1]);listenfd = open_listenfd(port);while(1){clientlen = sizeof(clientaddr);connfdp =malloc(sizeof(int));*connfdp = accept(listenfd,(SA *)&clientaddr,&clientlen);hp = gethostbyaddr((const char*)&clientaddr.sin_addr.s_addr,sizeof(clientaddr.sin_addr.s_addr),AF_INET);haddrp = inet_ntoa(clientaddr.sin_addr);printf("server connected to %s (%s)\n",hp->h_name,haddrp);pthread_create(&tid,NULL,thread,connfdp);pthread_join(tid,NULL);}
}void *thread(void *vargp){time_t lt;tm *local;char sbuf[MAXLINE];int cnt = 0,count = 0;char *fp = fopen("test.txt","wb");char rbuf[MAXLINE];int connfd = *((int*)vargp);free(vargp);pthread_detach(pthread_self());/*lt = time(NULL); local = localtime(&lt);strftime(sbuf,64,"%Y-%m-%d %H:%M:%S",local);send(connfd,sbuf,MAXLINE,0);*/
while(cnt = recv(connfd,rbuf,MAXLINE,0)){//printf("%d\n",recv(connfd,rbuf,MAXLINE,0));   fputs(rbuf,fp);bzero(rbuf,sizeof(rbuf));count += cnt;}//printf("传输成功!,该文件单词数共%d\n!",count);fclose(fp);itoa(count,sbuf);//send(connfd,sbuf,MAXLINE,0);printf("该文件单词数为%s!\n",sbuf);close(connfd);return NULL;
}void itoa (int n,char s[])
{int i,j,sign;char temp[MAXLINE];if((sign=n)<0)//记录符号n=-n;//使n成为正数i=0;do{temp[i++]=n%10+'0';//取下一个数字}while ((n/=10)>0);//删除该数字if(sign<0)temp[i++]='-';for(j=0;j<i;j++){//生成的数字是逆序的,所以要逆序输出s[j] = temp[i-j-1];}s[i] = '\0';
}
  • 程序运行结果截图:
  • 实验中遇到的问题:在自己电脑(Mac)运行代码出现如下问题:Static library link issue with Mac OS X: symbol(s) not found for architecture x86_64。
  • 解决方法:在网上寻找了许多方法都不能编译成功。最后在Mac里安装了Linux虚拟机,在虚拟机里做这个实验了。

转载于:https://www.cnblogs.com/lhyhahaha/p/7862818.html

2017-2018-1 20155209 实验三 实时系统相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    20155332 实验三 任务一: 1.学习使用Linux命令wc(1)2.基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端3.客户端传一个文本文件给服务器4 ...

最新文章

  1. 面试AI Lab能力测评
  2. 腾讯——这可是一只“骨骼清奇”的狗
  3. Jumony入门(二)初识选择器
  4. 《数据库原理与应用(第3版)》——1.4 数据库系统的组成
  5. 波卡链Substrate (4)托盘Pallets
  6. 大学计算机测试试题,大学计算机基础 excel测试题 求答案~~喵~~
  7. QString string char*互转
  8. VTK:PolyData之PointSource
  9. 一文掌握 Redis 常用知识点 | 图文结合
  10. 多段实例代码详解7大类Python运算符,建议收藏!
  11. 工作实践 之 Google Guava 工具集的使用 ,提高效率
  12. Protobuffer教程
  13. 智能会议系统(10)---WebRtc在H5视频聊天
  14. Java编程语言基础 第三章 实现会员信息录入功能
  15. android 显示Gift图片
  16. Netty系列三、Netty实战篇
  17. 幂法求解矩阵特征值及特征向量
  18. 智能家居(Domoticz)怎么能少了天气预报
  19. 挺带劲!这款免费开源的监控系统真强大~
  20. 盘点测试分析工具资源,文章教程/视频教程等你来体验!

热门文章

  1. Linux之bash shell基本命令
  2. Oracle 备份还原数据库练习.
  3. a=10a=0C语言,C语言基础练习题(含答案)
  4. datatables 无法 无法重新初始化datatable_伽巫塔罗:2020年9月运势占卜,摩羯没了热情,无法重新卡死...
  5. 打开ftp服务器上的文件夹时出错505,FTP提示505错误解决办法
  6. 【必看】谈谈变更过程中的运维意识
  7. Serverless 工程实践|自建 Apache OpenWhisk 平台
  8. 首届 KubeCon 2020 线上峰会隆重举办 | 云原生生态周报 Vol. 59
  9. matlab 画图比例缩小图片大小,Matlab 画图字体,字号的设定,图片大小和比例
  10. mysql最小费用最大流问题_算法笔记_140:最小费用最大流问题(Java)