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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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和新文件的内容进行比较,两次都发现发现接收到的文件和发送文件的内容完全相同,从而验证了远程进程通讯的可能性。

相关文档
最新文档