设为首页 加入收藏

TOP

[操作系统实验]使用命名通道实现进程通信(一)
2019-08-30 00:46:35 】 浏览:88
Tags:操作系统 实验 使用 命名 通道 实现 进程 通信

 

 


 

 

 

实验目的和要求

 

  • 了解windows系统环境下的进程通信机制

 

  • 熟悉windows系统提供的进程通信API

 

  完成两个进程之间的通信,需要建立两个工程文件,在Microsoft Visual C++ 6. 0环境下建立服务器工程文件PipeServer和客户端工程文件PipeClient.在服务器程序中,首先使用CreateNamedPipe()创建-一个命名管道,之后使用ConnectNamedPipe()连接命名管道,如果命名管道连接成功,可以使用读文件函数ReadFile()从命名管道中读数据,并可使用写文件函数WriteFile()向命名管道中写数据,命名管道使用完毕后可以使用DisconnectNamedPipe( )拆除与命名管道的连接。在客户端程序中,可以先使用WaitNamedPipe()等待服务器建立好命名管道,然后使用CallNamedPipe()与服务器建立命名管道的连接,并同时得到服务器发来的数据或向服务器发送数据.

 

 

 

 

 

微软基础C++类库,以C++类的形式封装了Windows API,并且包含应用程序框架,以减少应用程序开发人员的工作量。

 

       

头文件:

 1 #include "stdafx.h"    //标准应用框架扩展,定义环境参数,使得编译出来的程序能在32位的操作系统环境下运行
 2 #include "PipeClient.h"
 3 
 4 /*
 5 在工程设置里有一些设置会对该工程自动产生一系列的宏,用以控制程序的编译和运行。把代码夹在#ifdef _DEBUG和#endif 中间,在调试(DEBUG)下才会被编译
 6 */
 7 #ifdef _DEBUG    
 8 #define new DEBUG_NEW
 9 #undef THIS_FILE    //取消以前对THIS_FILE的定义
10 static char THIS_FILE[] = __FILE__;    //声明并初始化THIS_FILEO数组,数据的初始数据为该文件的文件名
11 #endif
12 
13 /////////////////////////////////////////////////////////////////////////////

#define new DEBUG_NEW

帮助查找内存错误。用户在程序中使用DEBUG_NEW,用户通常使用new运算符来从堆上分配。在Debug模式下(但定义了一个DEBUG符号),DEBUG_NEW为它分配的每个对象记录文件名和行号。

 

代码:

  1. 客户端代码
 1 CWinApp theApp;    //CWinApp为应用程序类
 2 
 3 using namespace std;    //命名空间
 4 
 5 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 6 {
 7     int nRetCode = 0;    //整型类型的
 8     int err = 0;
 9     BOOL rc = 0;
10     char lpName[] = "\\\\.\\pipe\\myPipe";
11     char InBuffer[50] = "";
12     char OutBuffer[50] = "";
13     DWORD BytesRead;
14 
15     while(1)
16     {
17         strcpy(InBuffer,"");
18         strcpy(OutBuffer,"");
19         printf("Input Data Please!\n");
20         scanf("%s",InBuffer);
21         rc = strcmp(InBuffer,"end");
22         if(rc == 0)
23         {
24             rc = CallNamedPipe(lpName,InBuffer,sizeof(InBuffer),OutBuffer,
25                 sizeof(OutBuffer),&BytesRead,NMPWAIT_USE_DEFAULT_WAIT);
26             break;
27         }
28         rc = WaitNamedPipe(lpName,NMPWAIT_WAIT_FOREVER);
29         if(rc == 0)
30         {
31             err = GetLastError();
32             printf("Wait Pipe Fail!err = %d\n",err);
33             exit(1);
34         }
35         else printf("Wait Pipe Success!\n");
36 
37         rc = CallNamedPipe(lpName,InBuffer,sizeof(InBuffer),OutBuffer,
38                 sizeof(OutBuffer),&BytesRead,NMPWAIT_USE_DEFAULT_WAIT);
39         rc = strcmp(OutBuffer,"end");
40         if(rc == 0) break;
41         if(rc == 0)
42         {
43             err = GetLastError();
44             printf("Pipe Call Fail!err = %d\n",err);
45             exit(1);
46         }
47         else printf("Pipe Call Success!\nDATA from Server is %s\n",OutBuffer);
48     }
49     printf("Now Client to be End!\n");
50     return nRetCode;
51 }

strcmp(s1,s2) 判断两个字符串s1和s2是否相同,相同返回true ,不同返回false

lpName[] = "\\client.\\pipe\\myPipe"  client为用命名管道通信时服务器的主机名或IP地址,myPipe为管道名

 

BOOL CallNamedPipe (
    LPCTSTR lpNamedPipeName, //命名管道的名称
    LPVOID lpInBuffer, //输出数据缓冲区指针
    DWORD nInBufferSize, //以字节为单位的输出数据缓冲区的大小
    LPVOID lpOutBuffer,//输入数据缓冲区指针
    DWORD nOutBufferSize, //以字节为单位的输入数据缓冲区的大小
    LPDWORD 1pBytesRead,//输入字节数指针
    DWORD nTimeOut//等待时间

    )

 

 

 

    2.服务器代码

 1 CWinApp theApp;
 2 using namespace std;
 3 
 4 int _tmain(int argc, TCHAR* arg
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇windows系统以及linux系统的优缺.. 下一篇在Windows7中的DPI与主题的问题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目