交大继续教育学院操作系统实验4参考答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四远程进程socket通信参考答案
(一)实验目的
系统v的IPC通信机制只支持同一台计算机内的进程间通信。BSD UNIX,系统V和Solaris等操作系统所提供的Socked(插座,套接字)是最重要的进程通信工具,可支持广域网上异种机器之间的通信,包括各类UNIX系统和使用最为广泛的个人计算机。通过本实验能使学生进一步理解套接字通信的基本原理和机制,通过编制一个实用的异机socket通信程序,深入掌握套接字编程的方法和细节。
(二)实验题目
分别编一个客机程序和服务器程序,首先建立客户程序与服务器之间正确的socket 连结,然后利用send和recv函数,客户程序将一个较长的文本文件(如几k字节)中的数据发送给服务器。要求服务器全部正确地接收到所有的数据(一个也不能少),并将其存入一个文件。
(三)源代码
服务器端:
#include
#include
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
#include
客户方程序调用形式:命令,主机名,端口号。
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和新文件的内容进行比较,两次都发现发现接收到的文件和发送文件的内容完全相同,从而验证了远程进程通讯的可能性。