利用windows api實現程式通訊(命名管道)
服務端:
1.使用API函式CreateNamedPipe建立與命名管道的連線。
2.使用API函式ConnectNamedPipe等待客戶端的連線。(可用這個函式將一個管道換成同另一個客戶連線,也就是可以重複呼叫該函式,但必須用DisconnectNamedPipe函式斷開之前程式的連線)
3.使用API函式WriteFile和ReadFile分別向客戶端傳送資料或從客戶端接收資料。
4.使用API函式CloseHandle關閉開啟的命名管道會話。
客戶端:
1.使用API函式WaitNamedPipe等待一個命名管道例項供自已使用。
2.使用API函式CreateFile建立與命名管道的連線。
3.使用API函式WriteFile和ReadFile分別向伺服器端傳送資料或從伺服器端接收資料。
4.使用API函式CloseHandle關閉開啟的命名管道會話。
服務端
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
//建立命名管道
// PIPE_ACCESS_DUPLEX 管道是雙向的
// PIPE_ACCESS_INBOUND 資料從客戶端流到伺服器端
// PIPE_ACCESS_OUTBOUND 資料從伺服器端流到客戶端
char buffer[1024];
wchar_t* name=L"\\\\.\\pipe\\test";
DWORD num;
HANDLE hPipe = CreateNamedPipe(name,PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE|PIPE_READMODE_BYTE,1,0,0,1000,NULL);
if(hPipe==INVALID_HANDLE_VALUE){
cout<<"create pipe error";
return 0;
}
cout<<"wait for client"<< endl;
//阻塞等待客戶端來連線
if(!ConnectNamedPipe(hPipe,NULL)){
cout<<"client connect error";
return 0;
}
cout << "client connect succ" << endl;
while(1){
if(ReadFile(hPipe,buffer,1024,&num,NULL)==false){
cout<<"read error";
break;
}
buffer[num]=0;
cout<<"read succ:"<<buffer<<endl;
}
//
cout<<"close pipe";
CloseHandle(hPipe);
return 0;
}
客戶端
#include <iostream>
#include <windows.h>
using namespace std;
int main(int argc, char *argv[])
{
//客戶端
//等待命名管道例項
char buffer[1024];
wchar_t *name=L"\\\\.\\pipe\\test";
DWORD num;
//阻塞等待
if(WaitNamedPipe(name,NMPWAIT_WAIT_FOREVER)==false){
cout<<"wait name pipe error"<<endl;
return 0;
}
cout<<"wait name succ"<<endl;
HANDLE hPipe = CreateFile(name,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hPipe==INVALID_HANDLE_VALUE){
cout<<"open name pipe error"<<endl;
return 0;
}
cout<<"open pipe and connect succ"<<endl;
int sendNum=0;
while(1){
sprintf(buffer,"sendxxxxxx:%d",sendNum);
Sleep(2000);
if(WriteFile(hPipe,buffer,strlen(buffer),&num,NULL)==false){
cout<<"write file error"<<endl;
break;
}
cout<<"send ok...."<<sendNum++<<endl;
}
CloseHandle(hPipe);
return 0;
}
相關文章
- windows命名管道Windows
- 匿名管道通訊實現
- Linux系統程式設計之程式間通訊方式:命名管道(二)Linux程式設計
- Linux系統程式設計之程式間通訊方式:命名管道(一)Linux程式設計
- Windows程式通訊之一看就懂的匿名管道通訊Windows
- 利用管道Pipelines做程序間的通訊
- 基於Windows API的命名管道的封裝與使用詳解WindowsAPI封裝
- Java的通過管道來實現執行緒通訊Java執行緒
- linux 程式間通訊之管道Linux
- Linux 的程式間通訊:管道Linux
- Linux程式間通訊②:有名管道FIFOLinux
- 系統程式設計——管道通訊程式設計
- linux程式間通訊--管道(PIPE & FIFO)Linux
- 溫故之.NET程式間通訊——管道
- 利用Storage Event實現頁面間通訊
- 20.2、python程式間通訊——佇列和管道Python佇列
- Java實現TCP通訊程式JavaTCP
- golang實現子程式通訊Golang
- Android小知識-利用OkHttp實現WebSocket通訊AndroidHTTPWeb
- 如何利用 Netty 實現自定義協議通訊?Netty協議
- 程序間通訊(1)-管道
- 管道流間的通訊
- 3|程式間通訊--有名管道學習筆記筆記
- 通過 App Groups 實現程式間通訊APP
- dotnet 替換 ASP.NET Core 的底層通訊為命名管道的 IPC 庫ASP.NET
- 介紹 Linux 中的管道和命名管道Linux
- 元件間通訊--利用mitt實現事件匯流排元件MIT事件
- 利用swagger和API Version實現api版本控制SwaggerAPI
- Linux 下的程式間通訊:使用管道和訊息佇列Linux佇列
- Linux系統程式設計之程式間通訊方式:管道(二)Linux程式設計
- Linux系統程式設計之程式間通訊方式:管道(一)Linux程式設計
- 在 OpenResty 裡實現程式間通訊REST
- 實現不同程式之間的通訊
- 併發技術3:管道通訊
- 詳解 CmProcess 跨程式通訊的實現
- 20 行 Python 程式碼實現加密通訊Python加密
- 使用命名管道承載gRPCRPC
- 自己動手實現 Shell 多程式管道符