您好,欢迎访问三七文档
实验3进程通信实验内容1管道通信实验内容12Socket通信实验目的实验内容准备知识实验原理实验指导管道通信实验目的了解管道的基本概念;掌握Linux支持的管道通信方式。实验内容本实验利用管道通信机制,实现输入字符串的自动分流操作。一共涉及3个管道,4个进程:(1)P1:从键盘接收输入字符串,写入管道Pipe1;(2)P2:从Pipe1接收字符串,若字符串的长度为偶数,则将其写入管道Pipe2,否则将其写入管道Pipe3;(3)P3:从Pipe2读出字符串,并显示“Pipe2:Evenlengthstring:偶长度字符串”;(4)P4:从Pipe3读出字符串,并显示“Pipe3:Oddlengthstring:奇长度字符串”;(5)输入exit程序退出。准备知识查阅相关资料理解管道的基本概念和相关知识;了解Linux支持的管道通信方式。实验原理管道的概念及特点管道是Linux进程通信的手段之一。两个进程:一个进程从管道的一端把数据输入进去,另一个进程可从管道的另一端读取这些数据。管道具有以下特点:(1)管道是半双工的,同一时间,数据只能单向流动;若两进程之间需要相互通信,则需需要建立两个管道;(2)Linux系统中把管道看作是一种特殊文件,采用文件管理的方法对管道进行管理,且只存在于内存中;(3)数据的读出和写入都是单向的,不能从管道写端读取数据,也不能向管道读端写入数据。管道的创建在程序设计中管道的创建是由系统调用pipe()函数实现的,其原型定义如下:#includeunistd.hintpipe(intfds[2]);管道的读写pipe()函数有一个参数fds[2],是用于管道两端的描述字。管道一端只能用于读,由描述字fds[0]表示,即管道读端;另一端则只能用于写,由描述字fds[1]表示,即管道写端。可在对管道进行读写等操作时,调用close、read、write等I/O函数实验指导假定进程P0在执行上述pipe命令建立管道后用fork命令创建了两个子进程P1和P2,P1和P2继承P0的文件获得管道fds使用权,因而可以相互通信实验的流程图如下图所示P1:P2:write(fds[1],...)read(fds[0],...)开始是否为P2执行结束NYP2从pipe1中读取数据P1往pipe1中写入数据P1创建子进程P2读取数据字符数为否为偶数P2创建子进程P3是否为P3执行P3从pipe2中读取数据P2往pipe2写入数据是否为P4执行P4从pipe3中读取数据P2创建子进程P4YNNNP2往pipe3写入数据YYSocket通信实验目的实验内容准备知识实验原理实验指导实验目的理解Socket通信的基本概念和工作原理;掌握Socket的建立、监听、连接、发送和接收数据的方法;在Linux下使用C语言设计和实现基于Socket通信的程序。实验内容在同一台机器上建立一个服务器端Server,一个客户端Client;建立Server与Client的连接;Server提供一个计算功能,即进行四则运算(除号用/代替);Client从键盘接收运算格式串,串的格式为:操作符(+-*÷)之一,操作数1,操作数2例如发送字符串:*,3,5表示要Sever计算3*5;Server接收命令串,解析并计算之,结果以字符串形式返回给Client;Client显示结果;输入q结束Client,Client结束前断开与Server的连接。准备知识掌握Socket通信的基本概念和工作原理;掌握必要的网络知识,如TCP协议。实验原理SocketSocket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,可以用来进行网络方面的程序设计与开发。Socket(套接字)是通过标准的Unix文件描述符和其它程序通信的一个方法。Socket数据传输是一种特殊的输入输出,Socket套接字也是一种文件描述符。Socket也具有一个类似于打开文件的创建函数Socket(),该函数返回一个整型的Socket描述符,随后的建立连接、消息传输等操作都是对该描述符进行操作的。每一个套接字都用一个半相关描述:{协议,本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述:{协议,本地地址、本地端口、远程地址、远程端口}。每一个套接字都有一个本地的由操作系统分配的唯一的套接字号。Socket的三种类型(1)流式Socket(SOCK_STREAM)流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。(2)数据报Socket(SOCK_DGRAM)数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠性、无差错。它使用数据报协议UDP。(3)原始Socket原始套接字允许对底层协议如IP或ICMP直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。有关Socket通讯的系统调用如下(1)sd=socket(domain,type,protocol):创建一个socket,返回一个整数,称为socket的描述符。(2)bind(sd,address,length):将sd与address绑定。(3)connect(sd,address,length):客户端用于发起一次连接。(4)listen(sd,length):服务器端通知核心,准备好接收来自客户端的连接。(5)nsd=accept(sd,address,length):服务器端具体接收一次连接,返回一个新描述符,用于接收。(6)count=send(sd,msg,length,flags):客户端用于发送一个消息。(7)coun=recv(sd,buf,length,flags):服务器端用于接收一个消息。(8)shutdown(sd,mode):结束一次连接,但sd依然有效。(9)close(sd):终止一个连接,并销毁相关的socket描述符sd。Unix的Socket通信形式如图10-4所示。实验指导1.首先建立服务端程序在服务端创建Socket,并进行初始化,指定其通信协议类型、地址及端口,注意需要将地址进行转换。创建Socket返回一个套接字标识,将其与声明的套接字变量绑定,准备好接收来自客户端的连接。每当接收到客户端发来的一次连接,向客户端返回一个接收到的消息,提示客户端输入需要计算的消息。接收到客户端发来的计算消息后,进行字节转换,然后进行计算,最后将结果返回到客户端,关闭客户端连接,完成一次会话。开始结束接收客户端的信息判断运算符类型并计算创建服务器端socket,并接收客户端的连接向客户端发送连接信息将运算结果发给客户端关闭客户端连接建立客户端程序首先创建客户端Socket,并对其进行初始化,返回一个客户端套接字标识,其中指定的通信协议类型、地址及端口要与服务端相同。向服务端发起一次连接并接收服务端的接收消息。服务端成功接收客户端的连接后,准备向服务端发送需计算的类型及参数并接收计算结果。用户输入q则关闭连接,关闭套接字,退出程序。开始结束客户端发送信息客户端接收计算结果创建客户端socket,并向服务器发起连接从服务器端接收连接信息输入是否为’q’NY关闭客户端套接字打开两个终端:服务端和客户端,终端进程间进行通信测试;首先需要打开服务端,初始化之后,服务端一直处于监听状态,等待客户端发起连接;之后打开客户端,指定服务端的地址,向服务端发起连接;如成功建立连接,则向服务端发送需计算的类型及参数,成功发送后,服务端会在当前显示接收状态,并将接收到的参数进行计算,将结果返回给客户端。客户端成功接收到计算结果并打印,提示输入下一个命令。
本文标题:实验3 进程通信
链接地址:https://www.777doc.com/doc-3232450 .html