当前位置:文档之家› 交大继续教育学院操作系统实验4参考答案

交大继续教育学院操作系统实验4参考答案

实验四远程进程socket通信参考答案
(一)实验目的
系统v的IPC通信机制只支持同一台计算机内的进程间通信。

BSD UNIX,系统V和Solaris等操作系统所提供的Socked(插座,套接字)是最重要的进程通信工具,可支持广域网上异种机器之间的通信,包括各类UNIX系统和使用最为广泛的个人计算机。

通过本实验能使学生进一步理解套接字通信的基本原理和机制,通过编制一个实用的异机socket通信程序,深入掌握套接字编程的方法和细节。

(二)实验题目
分别编一个客机程序和服务器程序,首先建立客户程序与服务器之间正确的socket 连结,然后利用send和recv函数,客户程序将一个较长的文本文件(如几k字节)中的数据发送给服务器。

要求服务器全部正确地接收到所有的数据(一个也不能少),并将其存入一个文件。

(三)源代码
服务器端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>
#include <sys/stat.h>
int main(int argc, char **argv)
{
int sockfd,newsockfd,fd,n,length;
struct sockaddr_in server;
char buff[1024],rbuf[1024],*path;
//open a socket and make the address
sockfd=socket(AF_INET,SOCK_STREAM,0); /* 生成套接字*/
server.sin_family=AF_INET; /* 生成套接字*/
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=0; /* 选择一个已释放的端口号*/
//bind the socket with address
if(bind(sockfd,(struct sockaddr *)&server,sizeof(server))<0) return 1;
length=sizeof(server); /* 获取并打印端口号*/
//print the information of the socket for client
if(getsockname(sockfd,(struct sockaddr *)&server,&length)<0) printf("getting socket name error\n");
printf("getting socket name:%s\n",server.sin_addr.s_addr);
printf("socket port #%d\n",ntohs(server.sin_port));
//wait for connecting
listen(sockfd,5);
while(1) {
newsockfd=accept(sockfd,(struct sockaddr *)0,(int *)0);
//accept a new connect
if(!fork()) { /* 子进程*/
close(sockfd);
bzero(buff,sizeof(buff)); /* 调用库函数,清缓冲区*/
// receive the file from client
fd=open("out.txt",O_WRONLY|O_CREAT|O_TRUNC,0644);
sleep(1);
while((count=recv(sockfd,rbuf,len,0))>0) {
n=write(fd,rbuf,count);
}
close(fd);
exit(0);
}
close(newsockfd);
}
return 0;
}
客户端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>
#include <sys/stat.h>
客户方程序调用形式:命令,主机名,端口号。

int main(int argc,char **argv)
int sockfd,fd,n;
struct sockaddr_in client;
struct hostent *hp,*gethostbyname();
char rbuf[1024];
sockfd=socket(AF_INET,SOCK_STREAM,0); /* 生成套接字*/
/* 与由命令行参数指定的主机建立连接*/
//receive arguments from main and fulfill it into socket address if((hp=gethostbyname(argv[1]))==NULL)
return 1;
client.sin_family=AF_INET;
bcopy((char*)hp->h_addr,
(char *)&client.sin_addr.s_addr,hp->h_length);
client.sin_port=htons(atoi(argv[2]));
//connect to host
if(connect(sockfd,(struct sockaddr *)&client,sizeof(client))<0) return 1;
fd=open("in.txt",O_RDONLY,0644);
while((n=read(fd,rbuf,1024))>0) {
if(n<1024)
rbuf[n]='\0';
send(sockfd,rbuf,n,0);
}
close(fd);
close(sockfd);
return 0;
}
实验结果:当在一台机器(客户端)发送一个文本文件和二进制文件信息结束后,在另外一台机器上发现生成了一个文件out.txt,对原文件in.txt和新文件的内容进行比较,两次都发现发现接收到的文件和发送文件的内容完全相同,从而验证了远程进程通讯的可能性。

实验四Shell程序设计参考答案
(一)实验目的
shell是一种高层次的程序设计语言。

学习和掌握shell程序设计能提高软件开发的效率,对于系统管理也是必经之路。

(二)源代码
1.编写一个递归的shell程序 findit,该程序搜索参数2指定的目录树,查找所有的以 .c和 .h结尾的文件,如文件行中含有参数1指定的字符串,显示该行和相应的文件名。

如目录参数2缺省,则从当前目录中搜索。

如:
findit searchstring /home/wang/work
搜索以 /home/wang/work为根的目录树中的c程序和头文件,查找含有searchstring 字符串的行,显示文件名。

findit searchstring
从当前目录开始搜索。

if test $# -eq 0 ;
then
findit $1 . # 当前目录作为搜索目录
else
if test -d $2; then
echo $2
grep –nH $1 $2/*.c $2/*.h #查找目录下C程序和头文件
#中的字符串
( cd $2 #进入子目录
for j in *; do
findit $1$j #递归调用
done
)
fi。

相关主题