C/C++ 進程通訊(命名管道)

来源:http://www.cnblogs.com/snaildev/archive/2017/08/10/7340483.html
-Advertisement-
Play Games

服務端代碼: 客戶端代碼: ...


服務端代碼:

// 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)\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 = %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 = %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 == hPipe)
     {
         printf("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 = %s, size = %d\n", buf, wlen);
                 char rbuf[256] = "";
                 DWORD rlen = 0;
                 ReadFile(hPipe, rbuf, sizeof(rbuf), &rlen, 0);    //接受服務發送過來的內容
                 printf("From Server: data = %s, size = %d\n", rbuf, rlen);
             }
             Sleep(1000);
         }
         CloseHandle(hPipe);//關閉管道
     }

    system("pause");
     return 0;
}

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目鏈接 Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,0) , and the radius is r.P and Q are two points not out ...
  • Description 高一一班的座位表是個n*m的矩陣,經過一個學期的相處,每個同學和前後左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對於選擇文科與理科有著自己的喜悅值,而一對好朋友如果能同時選文科或者理科,那麼他們又將收穫一些喜悅值。作為電腦競賽教練的scp大老闆,想知道如何分 ...
  • 關於GIT GIT 是一個分散式版本控制軟體,最初由林納斯·托瓦茲(Linus Torvalds)創作,於2005年以GPL發佈。最初目的是為更好地管理Linux內核開發而設計。是目前世界上最先進的分散式版本控制系統. 什麼是版本控制 版本控制(Revision control)是維護工程藍圖的標準 ...
  • 一切皆對象! 預習: #仿照正方形類寫一個圓形類 class Square: def __init__(self,length_of_side): self.length_of_side = length_of_side def square(self): '面積' return self.leng ...
  • [TOC] 1. 創建並聲明一個切麵 1. 首先,創建一個類,添加 註解使其添加到IoC容器 2. 然後,添加 註解,使其成為一個切麵 3. 最後,在配置文件裡面,使用``來使其生效 2. 使用切麵的通知 切麵總共有 6 個通知類型,其中五個常用的為:前置通知、後置通知、返回通知、異常通知、環繞通知 ...
  • spring.io官方提供的例子Building a RESTful Web Service提供了用Maven、Gradle、STS構建一個RESTFul Web Service,實際上採用STS構建會更加的便捷。 STS安裝參考。 目標 在瀏覽器中輸入url: 訪問後得到結果: 可以在url中帶上 ...
  • 1, OutOfMemoryError異常 除了程式計數器外,虛擬機記憶體的其他幾個運行時區域都有發生OutOfMemoryError(OOM)異常的可能, java Heap 溢出 一般的異常信息:java.lang.OutOfMemoryError:Java heap spacess java堆用 ...
  • 直接上代碼,相信以後會用到的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...