v[], TCHAR* envp[])
5 {
6 int nRetCode = 0;
7 int err;
8 BOOL rc;
9 HANDLE hPipeHandle1;
10
11 char lpName[] = "\\\\.\\pipe\\myPipe";
12 char InBuffer[50] = "";
13 char OutBuffer[50] = "";
14 DWORD BytesRead,BytesWrite;
15
16 hPipeHandle1 = CreateNamedPipe((LPCSTR)lpName,
17 PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED|WRITE_DAC,
18 PIPE_TYPE_MESSAGE|PIPE_READMODE_BYTE|PIPE_WAIT,
19 1,20,30,NMPWAIT_USE_DEFAULT_WAIT,
20 (LPSECURITY_ATTRIBUTES)NULL);
21
22 if((hPipeHandle1 == INVALID_HANDLE_VALUE)||(hPipeHandle1 == NULL))
23 {
24 err = GetLastError();
25 printf("Server Pipe Create Fail!err = %d\n",err);
26 exit(1);
27 }
28 else printf("Server Pipe Create Success!\n");
29
30 while(1)
31 {
32 rc = ConnectNamedPipe(hPipeHandle1,(LPOVERLAPPED)NULL);
33 if(rc == 0)
34 {
35 err = GetLastError();
36 printf("Server Pipe Connect Fail err = %d\n",err);
37 exit(2);
38 }
39 else printf("Server Pipe Connect Success\n");
40 strcpy(InBuffer,"");
41 strcpy(OutBuffer,"");
42
43 rc = ReadFile(hPipeHandle1,InBuffer,sizeof(InBuffer),&BytesRead,(LPOVERLAPPED)NULL);
44 if(rc == 0 && BytesRead ==0)
45 {
46 err = GetLastError();
47 printf("Server Read Pipe Fail!err = %d",err);
48 exit(3);
49 }
50 else printf("Server Read Pipe Success!\nDATA from Client is %s\n",InBuffer);
51 rc = strcmp(InBuffer,"end");
52 if(rc == 0) break;
53 printf("Please Input Data to Send\n");
54 scanf("%s",OutBuffer);
55 rc = WriteFile(hPipeHandle1,OutBuffer,sizeof(OutBuffer),&BytesWrite,(LPOVERLAPPED)NULL);
56 if(rc == 0) printf("Server Write Pipe Success!\n");
57 else printf("Server Write Pipe Success!\n");
58 DisconnectNamedPipe(hPipeHandle1);
59 rc = strcmp(OutBuffer,"end");
60 if(rc == 0) break;
61 }
62 }
CreateNamedPipe:创建一个命名管道实例,并返回该管道的句柄
HANDLE CreateNamedPipe(
LPCTSTR lpName, //命名管道的名称
DWORD dwOpenMode, //命名管道的访问模式DWORD dwPipeMode, //命名管道的模式
DWORD nMaxInstances, //可创建实例的最大值
DWORD nOutBufferSize, //以字节为单位的输出缓冲区的大小DWORD nInBufferSize, //以字节为单位的输入缓冲区的大小DWORD nDefaul tTimeOut, //默认超时时间
LPSECURITY_ ATTRIBUTES lpSecur ityAttr ibutes //安全属性
)
ConnectNamedPipe():连接命名管道。创建后的命名管道也等待客户端的连接,客户端可以使用函数CreateFile( )和CallNamedPipe()进行连接
BOOL ConnectNamedPipe (
HANDLE hNamedPipe,//命名管道实例句柄
LPOVERLAPED lpOverlapped //指向Overlapped结构的指针
)
BOOL ReadFile(
HANDLE hFile, //文件的句柄
LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
DWORD nNumberOfBytesToRead, //要读入的字符数
LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
LPOVERLAPPED lpOverlapped
)
BOOL WriteFile(
HANDLE hFile, //文件的句柄
LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
DWORD nNumberOfBytesToRead, //要读入的字符数
LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
LPOVERLAPPED lpOverlapped
//如文件打开时指定了FILE_FLAG_OVERLAPPED,定义了一次异步读取操作。否则,应将这个参数设为NULL
)
DisconnectNamedPipe(hPipeHandle1); //拆除命名管道服务器与客户端的连接
实验结果
该实验完成了两个进程的通信,请大家在下面程序的基础上增加和完善程序的功能,如设计一个聊天室等,使其可以实现自己的设计需求。可以使用命名管道创建命令CreateNamedPipe(),也可以使用文件创建命令CreateFile()来实现其功能,命名管道创建命令CreateNamedPipe()中的参数比较多,要仔细研究其含义,使用不当可能会导致两个进程通信的失败。