• 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 == hPipe)
         {
             printf("Create Pipe Error(%d)
    ",GetLastError());
         }
         else
         {
             printf("Waiting For Client Connection...
    ");
    
            if(!ConnectNamedPipe(hPipe, NULL))    //阻塞等待客户端连接。
             {
                 printf("Connection failed!
    ");
             }
             else
             {
                 printf("Connection Success!
    ");
             }
    
            while (true)
             {
                 if(!ReadFile(hPipe,buf,256,&rlen,NULL)) //接受客户端发送过来的内容
                 {            
                     printf("Read Data From Pipe Failed!
    ");
                     break;
                 }
                 else
                 {
                     printf("From Client: data = %s, size = %d
    ", 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 = %s, size = %d
    ", 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!
    ");
             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 == hPipe)
         {
             printf("open the exit pipe failed!
    ");
         }
         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!
    ");
                     break;
                 }
                 else
                 {
                     printf("To Server: data = %s, size = %d
    ", buf, wlen);
                     char rbuf[256] = "";
                     DWORD rlen = 0;
                     ReadFile(hPipe, rbuf, sizeof(rbuf), &rlen, 0);    //接受服务发送过来的内容
                     printf("From Server: data = %s, size = %d
    ", rbuf, rlen);
                 }
                 Sleep(1000);
             }
             CloseHandle(hPipe);//关闭管道
         }
    
        system("pause");
         return 0;
    }
    

      

    如需转载,请在显眼处标明本文链接,谢谢。
  • 相关阅读:
    c#剪切板操作
    eclipse mvn build error tips
    Redis Tips
    IntilliJ Idea 使用中的问题与解决方案
    mongo
    python
    SQL Relative
    sybase update
    run current vim file
    git
  • 原文地址:https://www.cnblogs.com/snaildev/p/7340483.html
Copyright © 2020-2023  润新知