实验3 进程通信.ppt
实验3 进程通信v实验内容实验内容1 管道通信管道通信v实验内容实验内容12 Socket通信通信v 实实 验验 目目 的的v 实实 验验 内内 容容v 准准 备备 知知 识识v 实实 验验 原原 理理v 实实 验验 指指 导导管道通信管道通信实验目的v 了解管道的基本概念;了解管道的基本概念;v 掌握掌握Linux支持的管道通信方式。支持的管道通信方式。实验内容v本实验利用管道通信机制,实现输入字符串的自动分流操本实验利用管道通信机制,实现输入字符串的自动分流操作。一共涉及作。一共涉及3个管道,个管道,4个进程:个进程:(1)P1:从键盘接收输入字符串,写入管道:从键盘接收输入字符串,写入管道Pipe1;(2)P2:从:从Pipe1接收字符串,若字符串的长度为偶数,接收字符串,若字符串的长度为偶数,则将其写入管道则将其写入管道Pipe2,否则将其写入管道,否则将其写入管道Pipe3;(3)P3:从:从Pipe2读出字符串,并显示读出字符串,并显示“Pipe2:Even length string:偶长度字符串偶长度字符串”;(4)P4:从:从Pipe3读出字符串,并显示读出字符串,并显示“Pipe3:Odd length string:奇长度字符串奇长度字符串”;(5)输入输入exit 程序退出。程序退出。准备知识v 查阅相关资料理解管道的基本概念和相关知识;查阅相关资料理解管道的基本概念和相关知识;v 了解了解LinuxLinux支持的管道通信方式。支持的管道通信方式。实验原理v 管道的概念及特点管道的概念及特点 管道是管道是Linux进程通信的手段之一。两个进程:一个进程从管道的进程通信的手段之一。两个进程:一个进程从管道的一端把数据输入进去,另一个进程可从管道的另一端读取这些数据。一端把数据输入进去,另一个进程可从管道的另一端读取这些数据。管道具有以下特点管道具有以下特点:(1)管道是半双工的,同一时间,数据只能单向流动;若两进程管道是半双工的,同一时间,数据只能单向流动;若两进程之间需要相互通信,则需需要建立两个管道;之间需要相互通信,则需需要建立两个管道;(2)Linux系统中把管道看作是一种特殊文件,采用文件管理的方系统中把管道看作是一种特殊文件,采用文件管理的方法对管道进行管理,且只存在于内存中;法对管道进行管理,且只存在于内存中;(3)数据的读出和写入都是单向的,不能从管道写端读取数据,数据的读出和写入都是单向的,不能从管道写端读取数据,也不能向管道读端写入数据。也不能向管道读端写入数据。v 管道的创建管道的创建 在程序设计中管道的创建是由系统调用在程序设计中管道的创建是由系统调用pipe()函数实现的,其原函数实现的,其原型定义如下:型定义如下:#include int pipe(int fds2);v 管道的读写管道的读写 pipe()函数有一个参数函数有一个参数fds2,是用于管道两端的描述字。管道一端,是用于管道两端的描述字。管道一端只能用于读,由描述字只能用于读,由描述字fds0表示,即管道读端;另一端则只能用于写,表示,即管道读端;另一端则只能用于写,由描述字由描述字fds1表示,即管道写端。可在对管道进行读写等操作时,调用表示,即管道写端。可在对管道进行读写等操作时,调用close、read、write等等I/O函数函数实验指导v假定进程假定进程P0在执行上述在执行上述pipe命令建立管道后用命令建立管道后用fork命令创命令创建了两个子进程建了两个子进程P1和和P2,P1和和P2继承继承P0的文件获得管道的文件获得管道fds使用权,因而可以相互通信使用权,因而可以相互通信v实验的流程图如下图所示实验的流程图如下图所示Socket通信v 实实 验验 目目 的的v 实实 验验 内内 容容v 准准 备备 知知 识识v 实实 验验 原原 理理v 实实 验验 指指 导导实验目的v理解理解Socket通信的基本概念和工作原理;通信的基本概念和工作原理;v掌握掌握Socket的建立、监听、连接、发送和接收数据的方法;的建立、监听、连接、发送和接收数据的方法;v在在Linux下使用下使用C语言设计和实现基于语言设计和实现基于Socket通信的程序。通信的程序。实验内容v在同一台机器上建立一个服务器端在同一台机器上建立一个服务器端Server,一个客户端,一个客户端Client;v建立建立Server 与与 Client的连接;的连接;vServer提供一个计算功能,即进行四则运算(除号用提供一个计算功能,即进行四则运算(除号用/代替)代替);vClient从键盘接收运算格式串,串的格式为:从键盘接收运算格式串,串的格式为:v操作符(操作符(*)之一,操作数)之一,操作数1,操作数,操作数2v例如发送字符串:例如发送字符串:*,3,5 表示要表示要Sever计算计算 3*5;vServer接收命令串,解析并计算之,结果以字符串形式返接收命令串,解析并计算之,结果以字符串形式返回给回给Client;vClient 显示结果;显示结果;v输入输入q结束结束Client,Client结束前断开与结束前断开与Server的连接。的连接。准备知识v掌握掌握Socket通信的基本概念和工作原理;通信的基本概念和工作原理;v掌握必要的网络知识,如掌握必要的网络知识,如TCP协议。协议。实验原理vSocketvSocket接口是接口是TCP/IP网络的网络的API,Socket接口定义了许多函数或例程,接口定义了许多函数或例程,可以用来进行网络方面的程序设计与开发。可以用来进行网络方面的程序设计与开发。Socket(套接字)是通过(套接字)是通过标准的标准的Unix文件描述符和其它程序通信的一个方法。文件描述符和其它程序通信的一个方法。Socket数据传输数据传输是一种特殊的输入输出,是一种特殊的输入输出,Socket套接字也是一种文件描述符。套接字也是一种文件描述符。Socket也具有一个类似于打开文件的创建函数也具有一个类似于打开文件的创建函数Socket(),该函数返回一个整,该函数返回一个整型的型的Socket描述符,随后的建立连接、消息传输等操作都是对该描述描述符,随后的建立连接、消息传输等操作都是对该描述符进行操作的。每一个套接字都用一个半相关描述:符进行操作的。每一个套接字都用一个半相关描述:协议,本地地协议,本地地址、本地端口址、本地端口来表示;一个完整的套接字则用一个相关描述:来表示;一个完整的套接字则用一个相关描述:协议,协议,本地地址、本地端口、远程地址、远程端口本地地址、本地端口、远程地址、远程端口。每一个套接字都有一。每一个套接字都有一个本地的由操作系统分配的唯一的套接字号。个本地的由操作系统分配的唯一的套接字号。vSocket的三种类型的三种类型 (1)流式流式Socket(SOCK_STREAM)流式套接字提供可靠的、面向连接的通信流;它使用流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,协议,从而保证了数据传输的正确性和顺序性。从而保证了数据传输的正确性和顺序性。(2)数据报数据报Socket(SOCK_DGRAM)数据报套接字定义了一种无连接的服务,数据通过相互独立的报数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠性、无差错。它使用数据报协文进行传输,是无序的,并且不保证可靠性、无差错。它使用数据报协议议UDP。(3)原始原始Socket 原始套接字允许对底层协议如原始套接字允许对底层协议如IP或或ICMP直接访问,它功能强大直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。但使用较为不便,主要用于一些协议的开发。v有关有关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。vUnix的的Socket通信形式如图通信形式如图10-4所示。所示。实验指导1.首先建立服务端程序首先建立服务端程序 在服务端创建在服务端创建Socket,并进行初始化,指定其通信协议类型、地址,并进行初始化,指定其通信协议类型、地址及端口,注意需要将地址进行转换。创建及端口,注意需要将地址进行转换。创建Socket返回一个套接字标识,返回一个套接字标识,将其与声明的套接字变量绑定,准备好接收来自客户端的连接。每当接将其与声明的套接字变量绑定,准备好接收来自客户端的连接。每当接收到客户端发来的一次连接,向客户端返回一个接收到的消息,提示客收到客户端发来的一次连接,向客户端返回一个接收到的消息,提示客户端输入需要计算的消息。接收到客户端发来的计算消息后,进行字节户端输入需要计算的消息。接收到客户端发来的计算消息后,进行字节转换,然后进行计算,最后将结果返回到客户端,关闭客户端连接,完转换,然后进行计算,最后将结果返回到客户端,关闭客户端连接,完成一次会话。成一次会话。v建立客户端程序建立客户端程序v首先创建客户端首先创建客户端Socket,并对其进行初始化,返回一个客,并对其进行初始化,返回一个客户端套接字标识,其中指定的通信协议类型、地址及端口户端套接字标识,其中指定的通信协议类型、地址及端口要与服务端相同。向服务端发起一次连接并接收服务端的要与服务端相同。向服务端发起一次连接并接收服务端的接收消息。服务端成功接收客户端的连接后,准备向服务接收消息。服务端成功接收客户端的连接后,准备向服务端发送需计算的类型及参数并接收计算结果。用户输入端发送需计算的类型及参数并接收计算结果。用户输入q则关闭连接,关闭套接字,退出程序。则关闭连接,关闭套接字,退出程序。v打开两个终端:服务端和客户端,终端进程间进行通信测打开两个终端:服务端和客户端,终端进程间进行通信测试;试;v首先需要打开服务端,初始化之后,服务端一直处于监听首先需要打开服务端,初始化之后,服务端一直处于监听状态,等待客户端发起连接;之后打开客户端,指定服务状态,等待客户端发起连接;之后打开客户端,指定服务端的地址,向服务端发起连接;如成功建立连接,则向服端的地址,向服务端发起连接;如成功建立连接,则向服务端发送需计算的类型及参数,成功发送后,服务端会在务端发送需计算的类型及参数,成功发送后,服务端会在当前显示接收状态,并将接收到的参数进行计算,将结果当前显示接收状态,并将接收到的参数进行计算,将结果返回给客户端。客户端成功接收到计算结果并打印,提示返回给客户端。客户端成功接收到计算结果并打印,提示输入下一个命令。输入下一个命令。