首页 > 代码库 > C/C++ 进程通讯(命名管道)

C/C++ 进程通讯(命名管道)

服务端代码:

// pipe_server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <ctime>

int main(int argc, _TCHAR* argv[])
{
     srand(time(NULL));

    char buf[256] = "";
     DWORD rlen = 0;
     HANDLE hPipe = CreateNamedPipe(
         TEXT("\\\\.\\Pipe\\mypipe"),                        //管道名
         PIPE_ACCESS_DUPLEX,                                    //管道类型 
         PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT,    //管道参数
         PIPE_UNLIMITED_INSTANCES,                            //管道能创建的最大实例数量
         0,                                                    //输出缓冲区长度 0表示默认
         0,                                                    //输入缓冲区长度 0表示默认
         NMPWAIT_WAIT_FOREVER,                                //超时时间
         NULL);                                                //指定一个SECURITY_ATTRIBUTES结构,或者传递零值

    if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hPipe)"Create Pipe Error(%d)\n",GetLastError());
     }
     else
     {
         printf("Waiting For Client Connection...\n");

        if(!ConnectNamedPipe(hPipe, NULL))    //阻塞等待客户端连接。
         {
             printf("Connection failed!\n");
         }
         else
         {
             printf("Connection Success!\n");
         }

        while (true)
         {
             if(!ReadFile(hPipe,buf,256,&rlen,NULL)) //接受客户端发送过来的内容
             {            
                 printf("Read Data From Pipe Failed!\n");
                 break;
             }
             else
             {
                 printf("From Client: data = http://www.mamicode.com/%s, size = %d/n", buf, rlen);
                 
                 char wbuf[256] = "";
                 sprintf(wbuf, "%s%d", wbuf, rand()%1000);
                 DWORD wlen = 0;
                 WriteFile(hPipe, wbuf, sizeof(wbuf), &wlen, 0);    //向客户端发送内容
                 printf("To Client: data = http://www.mamicode.com/%s, size = %d/n", wbuf, wlen);
                 Sleep(1000);
             }
         }
         FlushFileBuffers(hPipe); 
         DisconnectNamedPipe(hPipe); 
         CloseHandle(hPipe);//关闭管道
     }

    system("pause");
     return 0;
}

客户端代码:

// pipe_client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <ctime>

int main(int argc, _TCHAR* argv[])
{
     srand(time(NULL));

    DWORD wlen = 0;
     Sleep(1000);//等待pipe的创建成功!

    BOOL bRet = WaitNamedPipe(TEXT("\\\\.\\Pipe\\mypipe"), NMPWAIT_WAIT_FOREVER);

    if (!bRet)
     {
         printf("connect the namedPipe failed!\n");
         return 0;
     }

    HANDLE hPipe = CreateFile(            //管道属于一种特殊的文件
         TEXT("\\\\.\\Pipe\\mypipe"),    //创建的文件名
         GENERIC_READ | GENERIC_WRITE,    //文件模式
         0,                                //是否共享
         NULL,                            //指向一个SECURITY_ATTRIBUTES结构的指针
         OPEN_EXISTING,                    //创建参数
         FILE_ATTRIBUTE_NORMAL,            //文件属性(隐藏,只读)NORMAL为默认属性
         NULL);                            //模板创建文件的句柄

    if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= hPipe)"open the exit pipe failed!\n");
     }
     else
     {
         while(true)
         {
             char buf[256] = "";
             sprintf(buf,"%s%d",buf,rand()%1000);
             if(WriteFile(hPipe,buf,sizeof(buf),&wlen,0)==FALSE)    //向服务器发送内容
             {
                 printf("write to pipe failed!\n");
                 break;
             }
             else
             {
                 printf("To Server: data = http://www.mamicode.com/%s, size = %d/n", buf, wlen);
                 char rbuf[256] = "";
                 DWORD rlen = 0;
                 ReadFile(hPipe, rbuf, sizeof(rbuf), &rlen, 0);    //接受服务发送过来的内容
                 printf("From Server: data = http://www.mamicode.com/%s, size = %d/n", rbuf, rlen);
             }
             Sleep(1000);
         }
         CloseHandle(hPipe);//关闭管道
     }

    system("pause");
     return 0;
}

  

C/C++ 进程通讯(命名管道)