博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018-2019-1 20165325 实验三 实时系统
阅读量:5750 次
发布时间:2019-06-18

本文共 2863 字,大约阅读时间需要 9 分钟。

2018-2019-1 20165325 实验三 实时系统

任务一

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

蓝墨云班课链接:

2、实验步骤

使用man命令学习查看wc指令,结果如下:

1296594-20181118092440472-18324416.png

通过man命令我们很快知道接下来的实验中需要用到的便是-w参数——统计字数,仔细查看发现这里他们将字定义为由空白、跳格或换行字符分隔的字符串;

因此,判断字的逻辑可以这样写:

for(i=0; i

接着编程实现如下:

/////client.c#include 
#include
#include
#include
#include
#include
#define MYPORT 165325void main(){int clientfd;struct sockaddr_in remote_addr;char buffer[1024];memset(&remote_addr, 0 , sizeof(remote_addr));remote_addr.sin_family=AF_INET;remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");remote_addr.sin_port=htons(MYPORT); if((clientfd=socket(PF_INET,SOCK_STREAM,0))<0){ perror("socket"); } if(connect(clientfd, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr))<0){ perror("connect"); } int len; FILE *fp; char path[20]; gets(path); fp=fopen(path, "r"); char readch; int i=0; while((readch=fgetc(fp))!=EOF){ if(i<1024){ buffer[i]=readch; i++; } else{ i=0; int n=send(clientfd, buffer, 1024, 0); } } fclose(fp); if(i!=0) send(clientfd, buffer, i, 0); long wordscount; recv(clientfd, &wordscount, sizeof(long), 0); printf("%ld\n", wordscount); close(clientfd);}
/////server.c#include 
#include
#include
#include
#include
#include
#define MYPORT 165325void main(){ int serverfd, clientfd; struct sockaddr_in my_addr; struct sockaddr_in remote_addr; char buffer[1024]; memset(&my_addr, 0, sizeof(my_addr)); my_addr.sin_family=AF_INET; my_addr.sin_addr.s_addr=INADDR_ANY; my_addr.sin_port=htons(MYPORT); if((serverfd=socket(PF_INET, SOCK_STREAM, 0))==-1){ perror("socket"); } if(bind(serverfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))<0){ perror("bind"); } listen(serverfd, 5); int addrlen=sizeof(struct sockaddr_in); while(1){ if((clientfd=accept(serverfd, (struct sockaddr *)&remote_addr, &addrlen))<0){ perror("accept"); } printf("accept client %s\n", inet_ntoa(remote_addr.sin_addr)); int len, i; long wordscount=0; int flag=1; while(1){ if((len=recv(clientfd, buffer, 1024, 0))>0){ for(i=0; i
3、运行结果

1296594-20181118103536539-2121297085.png

任务二

1、实验要求

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

上方提交代码

下方提交测试

对比单线程版本的性能,并分析原因

2、代码
//server1#include 
#include
#include
#include
#include
#include
#include
#define MYPORT 165325pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;int serverfd, clientfd;char buffer[1024];void *my_wc(){ pthread_mutex_lock( &counter_mutex ); int len, i; long wordscount=0; int flag=1; while(1){ if((len=recv(clientfd, buffer, 1024, 0))>0){ for(i=0; i

只修改服务器端代码即可,编译时使用-lpthread,否则报错:“对‘pthread_create’未定义的引用”等;

3、截图

1296594-20181118110323032-1996610657.png

转载于:https://www.cnblogs.com/maxeysblog/p/9977009.html

你可能感兴趣的文章
iptables 生产环境配置
查看>>
ant android 打包签名和渠道
查看>>
Lua中的全局变量与环境
查看>>
linux命令学习(1)-awk
查看>>
ActionBar中SearchView创建的2种方式
查看>>
一个简单的接口,被调用并同步给出响应的方法
查看>>
rhel7.2使用lvm安装虚拟机
查看>>
公司网络很慢很卡的原因分析与处理
查看>>
Hadoop序列化与压缩
查看>>
由“男怕入错行”说开去
查看>>
php-fpm多实例运行
查看>>
MySQL数据库安装
查看>>
CGImageSource对图像数据读取任务的抽象
查看>>
我的友情链接
查看>>
xss test
查看>>
也谈svn分支与合并
查看>>
显式锁(第十三章)
查看>>
微软超融合私有云测试29-SCDPM2016部署之创建保护组备份(备份虚拟机)
查看>>
LBS“他爹”GIS
查看>>
同质化倾向的互联网金融 玖富带来了温度与色彩
查看>>