首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

CreatePipe匿名管道通信

大家好,又见面了,我是你们的朋友全栈君。 管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。     匿名管道实施细则     匿名管道由CreatePipe()函数创建,该函数在创建匿名管道的同时返回两个句柄:管道读句柄和管道写句柄。CreatePipe()的函数原型为:   BOOL CreatePipe(PHANDLE hReadPipe, // 指向读句柄的指针    PHANDLE hWritePipe, // 指向写句柄的指针    LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全属性的指针    DWORD nSize // 管道大小   );     通过hReadPipe和hWritePipe所指向的句柄可分别以只读、只写的方式去访问管道。在使用匿名管道通信时,服务器进程必须将其中的一个句柄传送给客户机进程。句柄的传递多通过继承来完成,服务器进程也允许这些句柄为子进程所继承。除此之外,进程也可以通过诸如DDE或共享内存等形式的进程间通信将句柄发送给与其不相关联的进程。     在调用CreatePipe()函数时,如果管道服务器将lpPipeAttributes 指向的SECURITY_ATTRIBUTES数据结构的数据成员bInheritHandle设置为TRUE,那么CreatePipe()创建的管道读、写句柄将会被继承。管道服务器可调用DuplicateHandle()函数改变管道句柄的继承。管道服务器可以为一个可继承的管道句柄创建一个不可继承的副本或是为一个不可继承的管道句柄创建一个可继承的副本。CreateProcess()函数还可以使管道服务器有能力决定子进程对其可继承句柄是全部继承还是不继承。     在生成子进程之前,父进程首先调用Win32 API SetStdHandle()使子进程、父进程可共用标准输入、标准输出和标准错误句柄。当父进程向子进程发送数据时,用SetStdHandle()将管道的读句柄赋予标准输入句柄;在从子进程接收数据时,则用SetStdHandle()将管道的写句柄赋予标准输出(或标准错误)句柄。然后,父进程可以调用进程创建函数CreateProcess()生成子进程。如果父进程要发送数据到子进程,父进程可调用WriteFile()将数据写入到管道(传递管道写句柄给函数),子进程则调用GetStdHandle()取得管道的读句柄,将该句柄传入ReadFile()后从管道读取数据。     如果是父进程从子进程读取数据,那么由子进程调用GetStdHandle()取得管道的写入句柄,并调用WriteFile()将数据写入到管道。然后,父进程调用ReadFile()从管道读取出数据(传递管道读句柄给函数)。     在用WriteFile()函数向管道写入数据时,只有在向管道写完指定字节的数据后或是在有错误发生时函数才会返回。如管道缓冲已满而数据还没有写完,WriteFile()将要等到另一进程对管道中数据读取以释放出更多可用空间后才能够返回。管道服务器在调用CreatePipe()创建管道时以参数nSize对管道的缓冲大小作了设定。     匿名管道并不支持异步读、写操作,这也就意味着不能在匿名管道中使用ReadFileEx()和WriteFileEx(),而且ReadFile()和WriteFile()中的lpOverLapped参数也将被忽略。匿名管道将在读、写句柄都被关闭后退出,也可以在进程中调用CloseHandle()函数来关闭此句柄   /   匿名管道程序示例     总的来说,匿名管道程序是比较简单的。在下面将要给出的程序示例中,将由父进程(管道服务器)创建一个子进程(管道客户机),子进程回见个其全部的标准输出发送到匿名管道中,父进程再从管道读取数据,一直到子进程关闭管道的写句柄。其中,匿名管道服务器程序的实现清单如下:   STARTUPINFO si;   PROCESS_INFORMATION pi;   char ReadBuf[100];   DWORD ReadNum;   HANDLE hRead; // 管道读句柄   HANDLE hWrite; // 管道写句柄   BOOL bRet = CreatePipe(&hRead, &hWrite, NULL, 0); // 创建匿名管道   if (bRet

01

计算机网络原理(谢希仁第八版)第六章课后习题答案

1.互联网的域名结构是怎样的?它与目前的电话网的号码结构有何异同之处? 答:(1)域名的结构由标号序列组成,各标号之间用点隔开:… 三级域名. 二级域名. 顶级域名,各标号分别代表不同级别的域名。 (2)电话号码分为国家号结构分为(中国+86)、区号、本机号。 2.域名系统的主要功能是什么?域名系统中的本地域名服务器、根域名服务器、顶级域名服务器以及权限域名权服务器有何区别? 答: 域名系统的主要功能:将域名解析为主机能识别的IP 地址。因特网上的域名服务器系统也是按照域名的层次来安排的。每一个域名服务器都只对域名体系中的一部分进行管辖。共有三种不同类型的域名服务器。即本地域名服务器、根域名服务器、授权域名服务器。当一个本地域名服务器不能立即回答某个主机的查询时,该本地域名服务器就以DNS 客户的身份向某一个根域名服务器查询。若根域名服务器有被查询主机的信息,就发送DNS 回答报文给本地域名服务器,然后本地域名服务器再回答发起查询的主机。但当根域名服务器没有被查询的主机的信息时,它一定知道某个保存有被查询的主机名字映射的授权域名服务器的IP 地址。通常根域名服务器用来管辖顶级域。根域名服务器并不直接对顶级域下面所属的所有的域名进行转换,但它一定能够找到下面的所有二级域名的域名服务器。每一个主机都必须在授权域名服务器处注册登记。通常,一个主机的授权域名服务器就是它的主机ISP 的一个域名服务器。授权域名服务器总是能够将其管辖的主机名转换为该主机的IP 地址。因特网允许各个单位根据本单位的具体情况将本域名划分为若干个域名服务器管辖区。一般就在各管辖区中设置相应的授权域名服务器。 3.举例说明域名转换的过程。域名服务器中的高速缓存的作用是什么? 答:**栗子:**把不方便记忆的IP 地址转换为方便记忆的域名地址。 作用:可大大减轻根域名服务器的负荷,使因特网上的DNS 查询请求和回答报文的数量大为减少。 4.设想有一天整个因特网的DNS系统都瘫痪了(这种情况不大会出现),试问还可以给 朋友发送电子邮件吗? 答:DNS是因特网上使用的命名系统,用来便于人们使用域名转换为IP地址,通常人们发送电子邮件时是通过邮箱服务器别名来进行识别的,如果DNS系统瘫痪时,虽然无法通过邮箱服务器别名查找邮件地址,但可以通过IP地址直接进行通信,前提是你必须记住自己邮箱服务器的IP地址和朋友邮箱服务器的IP地址。 5.文件传送协议FTP的主要工作过程是怎样的?为什么说FTP是带外传送控制信息?主进程和从属进程各起什么作用? 答: FTP 使用客户服务器方式。一个FTP 服务器进程可同时为多个客户进程提供服务。FTP 的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求。主进程的工作步骤: ①打开熟知端口(端口号为21),使客户进程能够连接上。 ②等待客户进程发出连接请求。 ③启动从属进程来处理客户进程发来的请求。从属进程对客户进程的请求处理完毕后即终止,但从属进程在运行期间根据需要还可能创建其他一些子进程。 ④回到等待状态,继续接受其他客户进程发来的请求。主进程与从属进程的处理是并发地进行。 FTP 使用两个TCP 连接。 控制连接在整个会话期间一直保持打开,FTP 客户发出的传送请求通过控制连接发送给服务器端的控制进程,但控制连接不用来传送文件。 实际用于传输文件的是“数据连接”。服务器端的控制进程在接收到FTP 客户发送来的文件传输请求后就创建“数据传送进程”和“数据连接”,用来连接客户端和服务器端的数据传送进程。数据传送进程实际完成文件的传送,在传送完毕后关闭“数据传送连接”并结束运行。 6.简单文件传送协议TFTP与FTP的主要区别是什么?各用在什么场合? 答:文件传送协议FTP只提供文件传送的一些基本的服务,它使用TCP可靠的运输服务。 FTP的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。 FTP使用客户服务器方式。一个FTP服务器进程可同时为多个客户进程提供服务。FTP的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求。 TFTP是一个很小且易于实现的文件传送协议。 TFTP使用客户服务器方式和使用UDP数据报,因此TFTP需要有自己的差错改正措施。 TFTP只支持文件传输而不支持交互。 TFTP没有一个庞大的命令集,没有列目录的功能,也不能对用户进行身份鉴别。 7.远程登录TELNET 的主要特点是什么?什么叫做虚拟终端NVT? 答:(1)用户用TELNET就可在其所在地通过TCP连接注册(即登录)到远地的另一个主机上(使用主机名或IP地址)。 TELNET能将用户的击键传到远地主机,同时也能将远地主机的输出通过TCP连接返回到用户屏幕。这种服务是透明的,因为用户感觉到好像键

02
领券