1. 程式人生 > >程序間通訊之命名管道

程序間通訊之命名管道

server:

#include <stdio.h>
#include <conio.h>  
#include <tchar.h>
#include <Windows.h>
#include <process.h>
#include <stdlib.h>
#include <iostream>
const char *pStrPipeNameGet = "\\\\.\\pipe\\recv_data_pipe";// 注意命名管道的規則:\\servername\pipe\pipename,如果是本地管道則servername可以使用點“.”
HANDLE hSemaphore;

void RecvDataThread(PVOID p) 
{
	printf("管道伺服器已經啟動,等待連線...\n");

	// 建立一個命名管道
	HANDLE hPipe = CreateNamedPipe(pStrPipeNameGet, // 管道的名稱
		                           PIPE_ACCESS_DUPLEX,// 管道的開啟模式
		                           PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,// 管道的使用模式
		                           PIPE_UNLIMITED_INSTANCES, // 管道可以接收的最大客戶量
		                           0, // 輸出緩衝區長度;零表示用預設設定
		                           0, // 輸入緩衝區長度;零表示用預設設定
		                           NMPWAIT_WAIT_FOREVER, // 管道的預設等待超時
		                          NULL);// 安全屬性結構
	
	const int BUFFER_MAX_LEN = 1024;
	DWORD dwRecvDataLen;
	char buf[BUFFER_MAX_LEN];
	// 等待客戶端管道的連線
	if (ConnectNamedPipe(hPipe, NULL) != NULL)  
	{
		printf("連線成功,開始接收資料\n");
		while (true)
		{
			// 接收客戶端傳送的資料  
			if (!ReadFile(hPipe, buf, BUFFER_MAX_LEN, &dwRecvDataLen, NULL))
				break;
			printf("接收到來自客戶端的資料長度為%d位元組\n", dwRecvDataLen);
			printf("具體資料內容如下:");
			std::cout << buf << std::endl;
		}
	}
	else
	{
		printf("連線失敗\n");
	}

	// 斷開所有與命名管道上的連線
	DisconnectNamedPipe(hPipe);

	// 關閉命名管道
	CloseHandle(hPipe);

	ReleaseSemaphore(hSemaphore, 1, NULL);
}

int _tmain(int argc, _TCHAR* argv[])
{
	hSemaphore = CreateSemaphore(NULL, 0, 1, TEXT("my_semaphore"));
	_beginthread(RecvDataThread, NULL, NULL);
	WaitForSingleObject(hSemaphore, INFINITE);

	std::cout << "按任意鍵退出." << std::endl;
	std::cin.get();
	return 0;
}
client:
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <conio.h>  
#include <iostream>
const char *pStrPipeName = "\\\\.\\pipe\\recv_data_pipe";
const int BUFFER_MAX_LEN = 1024;
char buf[BUFFER_MAX_LEN];

int _tmain(int argc, _TCHAR* argv[])
{
	printf("等待管道伺服器......\r\n");
	if (!WaitNamedPipe(pStrPipeName, 100000))
	{
		printf("連線管道伺服器失敗.\r\n");
		std::cin.get();
		return 0;
	}
	HANDLE hPipe = CreateFile(pStrPipeName, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	while (true)
	{
		printf("請輸入要向服務端傳送的資料,回車鍵結束,最大1024個位元組\r\n");
		DWORD dwLen = 0;
		int bufSize;
		std::cin >> buf;
		bufSize = strlen(buf)+1;
		buf[bufSize] = '\0';
		//向服務端傳送資料  
		if (WriteFile(hPipe, buf, bufSize, &dwLen, NULL)) {
			printf("資料寫入完畢共%d位元組\r\n", dwLen);
		}
		else
		{
			printf("資料寫入失敗\n");
		}
		if (strcmp(buf, "exit") == 0)
			break;
	}
	CloseHandle(hPipe);
	return 0;
}



相關推薦

程序通訊命名管道

server: #include <stdio.h> #include <conio.h> #include <tchar.h> #include <Windows.h> #include <process.h>

Python程序通訊命名管道

管道是一種簡單的FIFO通訊通道,它是單向通訊的。 通常啟動程序建立一個管道,然後這個程序建立一個或者多個程序子程序接受管道資訊,由於管道是單向通訊,所以經常需要建立兩個管道來實現雙向通訊。 命名管道是對傳統管道的擴充套件,預設的管道是匿名管道,只在程式執行時

Python程序通訊命名管道(Windows)

前面文章說了一下 Linux 命名管道的實現,今天看看 Windows 上我們怎麼實現。 在 Windows 上的命名管道主要是通過呼叫 win32 api 的以下方法來實現的: - win32pipe.CreateNamedPipe() - win32p

《Linux 程序通訊命名管道:FIFO

命名管道的主要用途:不相關的程序之間交換資料。   命令列上建立命名管道: $ mkfifo filename    程式中建立命名管道: #include <sys/types.h> #include <sys/stat.h>

Linux高階程式設計基礎——程序通訊匿名管道

程序間通訊之匿名管道 利用匿名管道實現父子程序間通訊,要求 父程序傳送字串“hello child”給子程序; 子程序收到父程序傳送的資料後,給父程序回覆“hello farther”; 父子程序通訊完畢,父程序依次列印子程序的退出狀態以及子程序的pid。

Linux程序通訊——使用命名管道

在前一篇文章——Linux程序間通訊——使用匿名管道中,我們看到了如何使用匿名管道來在程序之間傳遞資料,同時也看到了這個方式的一個缺陷,就是這些程序都由一個共同的祖先程序啟動,這給我們在不相關的的程序之間交換資料帶來了不方便。這裡將會介紹程序的另一種通訊方式——命名管道,來

Linuxc 程序通訊匿名管道1 父子通訊

利用匿名管道實現父子程序間通訊,要求1.父程序傳送字串“hello child”給子程序;2.子程序收到父程序傳送的資料後,給父程序回覆“hello farther”;3.父子程序通訊完畢,父程序依次列印子程序的退出狀態以及子程序的pid。原始碼:#include <u

程序通訊Linux C命名管道程式設計

命名管道 管道(匿名管道)的使用侷限性大,這與管道的實現機制有關。而命名管道(Named Pipe)不僅可在同一臺計算機的任意不同程序之間通訊,而且還可以在跨越一個網路的不同計算機的不同程序之間,支援可靠的、單向或雙向的資料通訊。 命名管道不同於管道之處在於它提供一個路徑

Linux:程序通訊管道通訊詳解

        在學習程序的時候,我們瞭解到了程序的獨立性:程序之間是相互獨立的,每個程序有自己的虛擬地址空間,並且虛擬地址空間通過頁表的對映,對映到屬於自己的實體記憶體上。並且各個程序之間互相不影響,執行自己的程式碼。    

程序通訊Linux C管道程式設計

管道簡述 管道(pipe)是Unix/Linux中最常見的程序間通訊方式之一,它在兩個程序之間實現一個數據流通的通道,資料以一種資料流的方式在程序間流動。在系統中,管道相當於檔案系統上的一個檔案,用於快取所要傳輸的資料。在某些特性上又不同於檔案,例如當資料讀出後,管道中就沒有資料了,但檔案沒

Linux:程序通訊(匿名管道命名管道)(共享記憶體,訊息佇列,訊號量)

目錄 程序間通訊的介紹 管道 匿名管道 原理: 程式碼實現 匿名管道特性 實現管道符 |  命名管道 命名管道特性 程式碼實現 管道讀寫規則 作業系統中ipc的相關命令 共享記憶體(重點) 生命週期: 程式碼實現 程式碼實現獲

程序通訊管道--pipe和fifo使用

匿名管道pipe 函式原型: #include <unistd.h> int pipe(int fildes[2]); 引數說明 fildes是我們傳入的陣列,也是一個傳出引數。fildes[0]是讀端,fildes[1]是寫端。 返回值 成功呼叫返回0。 失敗呼叫返回-1且

程序通訊命名管道(FIFO)

匿名管道只能於有血緣關係的程序,那麼倆個沒有任何關係的程序怎麼通訊,這就出現了命名管道來克服這一問題。命名管道是一個裝置檔案,只要訪問該路徑,就能通過這個共享資源來互相通訊。FIFO是按照先進先出的原則工作的,第一個被寫入的資料第一個先被讀出。FIFO可被用於複製序列管道命

程序通訊管道通訊(PIPE匿名管道)

#include<stdio.h> #include<errno.h> #include<fcntl.h> #include<unistd.h> #include<stdlib.h> #include<string.h> int

Linux程序通訊——管道(整理)

 程序間通訊 fork pipe pie_t 等用法(管道機制 通訊) 每個程序各自有不同的使用者地址空間,任 何一個程序的全域性變數在另一個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝 區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從

Linux -- 程序通訊管道

管道是Linux裡的一種檔案型別,同時也是Linux系統下程序間通訊的一種方式 建立一個管道檔案有兩種方式: 1.  Shell 下命令 mkfifo + filename,即建立一個有名管道 2.

Linux 程序通訊管道

程序之間的通訊之管道 目錄 1 無名管道    管道是一種最基本的IPC機制,作用於父子程序之間,完成資料傳遞。 管道有以下特性: 1.其本質是一個偽檔案(實為核心緩衝區)其本質是一個偽檔案(實為核心緩衝區) 2.由兩

Linux 程序通訊 命名管道

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> int main() { int fb =

linux (五)程序通訊(匿名管道命名管道,訊息佇列)

程序間通訊 程序間通訊的目的 資料傳輸:一個程序需要將他的資料傳送給另一個程序 資源共享:多個程序之間共享同樣的資源 通知事件:一個程序需要向另一個或一組程序傳送訊息,通知它發生了某種事件(如程序終止時要通知父程序) 程序控制:有寫程序希望完全控制另一

Linux下的程序通訊管道

在Linux下,每個程序各自有不同的使用者地址空間,任何一個程序的全域性變數在另一個程序中都看不到所以進 程之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通