C/C++ 進(jìn)程通訊(命名管道)的實(shí)例
更新時(shí)間:2017年08月11日 07:49:56 投稿:jingxian
下面小編就為大家?guī)?lái)一篇C/C++ 進(jìn)程通訊(命名管道)的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
服務(wù)端代碼:
// pipe_server.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#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, //管道參數(shù)
PIPE_UNLIMITED_INSTANCES, //管道能創(chuàng)建的最大實(shí)例數(shù)量
0, //輸出緩沖區(qū)長(zhǎng)度 0表示默認(rèn)
0, //輸入緩沖區(qū)長(zhǎng)度 0表示默認(rèn)
NMPWAIT_WAIT_FOREVER, //超時(shí)時(shí)間
NULL); //指定一個(gè)SECURITY_ATTRIBUTES結(jié)構(gòu),或者傳遞零值
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)) //接受客戶端發(fā)送過(guò)來(lái)的內(nèi)容
{
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); //向客戶端發(fā)送內(nèi)容
printf("To Client: data = %s, size = %d\n", wbuf, wlen);
Sleep(1000);
}
}
FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);//關(guān)閉管道
}
system("pause");
return 0;
}
客戶端代碼:
// pipe_client.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#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的創(chuàng)建成功!
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"), //創(chuàng)建的文件名
GENERIC_READ | GENERIC_WRITE, //文件模式
0, //是否共享
NULL, //指向一個(gè)SECURITY_ATTRIBUTES結(jié)構(gòu)的指針
OPEN_EXISTING, //創(chuàng)建參數(shù)
FILE_ATTRIBUTE_NORMAL, //文件屬性(隱藏,只讀)NORMAL為默認(rèn)屬性
NULL); //模板創(chuàng)建文件的句柄
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) //向服務(wù)器發(fā)送內(nèi)容
{
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); //接受服務(wù)發(fā)送過(guò)來(lái)的內(nèi)容
printf("From Server: data = %s, size = %d\n", rbuf, rlen);
}
Sleep(1000);
}
CloseHandle(hPipe);//關(guān)閉管道
}
system("pause");
return 0;
}
以上這篇C/C++ 進(jìn)程通訊(命名管道)的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)ATM自動(dòng)取款機(jī)系統(tǒng)的示例代碼
ATM自動(dòng)取款機(jī)系統(tǒng)是銀行業(yè)務(wù)流程中十分重要且必備的環(huán)節(jié)之一,在銀行業(yè)務(wù)流程中起著承上啟下的作用。本文將用C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的ATM自動(dòng)取款機(jī)系統(tǒng),需要的可以參考一下2022-08-08
opencv3/C++關(guān)于移動(dòng)對(duì)象的輪廓的跟蹤詳解
今天小編就為大家分享一篇opencv3/C++關(guān)于移動(dòng)對(duì)象的輪廓的跟蹤詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
C語(yǔ)言實(shí)現(xiàn)YUV文件轉(zhuǎn)JPEG格式
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)將YUV文件轉(zhuǎn)為JPEG格式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
詳解C語(yǔ)言gets()函數(shù)與它的替代者fgets()函數(shù)
這篇文章主要介紹了詳解C語(yǔ)言gets()函數(shù)與它的替代者fgets()函數(shù)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
C語(yǔ)言實(shí)現(xiàn)經(jīng)典掃雷小游戲的示例代碼
掃雷游戲是在一個(gè)指定的二維空間里,隨機(jī)布置雷,把不是雷的位置都找出來(lái),在你點(diǎn)一個(gè)位置的時(shí)候它會(huì)顯示它周圍全部雷的個(gè)數(shù),根據(jù)這個(gè)線索去找 ,會(huì)更容易贏。本文將用C語(yǔ)言實(shí)現(xiàn)這一經(jīng)典游戲,感興趣的可以嘗試一下2022-11-11

