2.4实验四:使用命名管道实现进程通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学生姓名:张鹏学号:150705040
实验地点:数计学院407实验室
实验课时:3学时实验器材:计算机
课程名称:计算机操作系统
实验名称:2.4实验四:使用命名管道实现进程通信
一、实验目的
1、进一步掌握windows系统环境下进程通信机制。
2、熟悉进程通信API
二、实验环境及工具
Windows 7 操作系统,VC6
三、实验内容
使用Windows系统提供的命名管道完成两个进程之间的通信,要求能正确使用创建命名管道CreateNamePipe()、连接命名管道ConnectNamePipe()、拆除命名管道的连接DisconnectNamePipe()、连接服务器已建立的命名管道CallNamePipe()、等待命名管道WaitNamePipe()等API.
四、实验步骤
服务端
// PipeServer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "PipeServer.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
int err;
BOOL rc;
HANDLE hPipeHandle1;
char lpName[]="\\\\.\\pipe\\myPipe";
char InBuffer[50]="";
char OutBuffer[50]="";
DWORD BytesRead,BytesWrite;
hPipeHandle1=CreateNamedPipe(
(LPCTSTR)lpName,
PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED|WRITE_DAC,
PIPE_TYPE_MESSAGE|PIPE_READMODE_BYTE|PIPE_W AIT,
1,20,30,NMPWAIT_USE_DEFAULT_WAIT,
(LPSECURITY_A TTRIBUTES)NULL
);
if((hPipeHandle1==INV ALID_HANDLE_V ALUE)||(hPipeHandle1==NULL))
{
err=GetLastError();
printf("Server Pipe Creat Fail!err=%d\n",err);
exit(1);
}
else printf("Server Pipe Creat Success!\n");
while(1)
{
rc=ConnectNamedPipe(hPipeHandle1,(LPOVERLAPPED)NULL);
if(rc==0)
{
err=GetLastError();
printf("Server Pipe Connect Fail err=%d\n",err);
exit(2);
}
else printf("Server Pipe Connect Success\n");
strcpy(InBuffer,"");
strcpy(OutBuffer,"");
rc=ReadFile(hPipeHandle1,InBuffer,sizeof(InBuffer),&BytesRead,
(LPOVERLAPPED)NULL);
if(rc==0&&BytesRead==0)
{
err=GetLastError();
printf("Server Read Pipe Fail err=%d\n",err);
exit(3);
}
else
{
printf("Server Read Pipe Success!\nDA TA from Client is=%s\n",InBuffer);
}
rc=strcmp(InBuffer,"end");
if(rc==0) printf("Server Write Pipe Fail!\n");
else printf("Server Write Pipe Success!\n");
DisconnectNamedPipe(hPipeHandle1);
rc=strcmp(OutBuffer,"end");
if(rc==0) break;
}
printf("Now Server be END!\n");
CloseHandle(hPipeHandle1);
/* // initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
CString strHello;
strHello.LoadString(IDS_HELLO);
cout << (LPCTSTR)strHello << endl;
}*/
return nRetCode;
}
客户端
// PipeClient.cpp : Defines the entry point for the console application.