利用windows api實現程式通訊(命名管道)

晚餐吃什麼發表於2018-11-04

服務端:
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;

}

 

相關文章