windows pipe
生活随笔
收集整理的這篇文章主要介紹了
windows pipe
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
管道分為 匿名管道 和 命名管道 。
1.匿名管道僅僅能在父子進程間進行通信。不能在網絡間通信,并且傳輸數據是單向的。僅僅能一端寫,還有一端讀。
2.命令管道能夠在隨意進程間通信。通信是雙向的,隨意一端都可讀可寫,可是在同一時間僅僅能有一端讀、一端寫。
每個 命名管道 都有一個唯一的名字以區分于存在于系統的命名對象列表中的其它命名管道。管道server在調用CreateNamedPipe()函數創建命名管道的一個或多個實例時為其指定了名稱。
對于管道客戶機。則是在調用CreateFile()或CallNamedPipe()函數以連接一個命名管道實例時對管道名進行指定。
命名管道的命名規范與郵槽有些相似。對其標識也是採用的UNC格式:
\ServerPipe[Path]Name
當中。第一部分Server指定了server的名字,命名管道服務即在此server創建。其字串部分可表示為一個小數點(表示本機)、星號(當前網絡字段)、域名或是一個真正的服務;第二部分Pipe與郵槽的Mailslot一樣是一個不可變化的硬編碼字串,以指出該文件是從屬于NPFS;第三部分[Path]Name則使應用程序能夠唯一定義及標識一個命名管道的名字。并且能夠設置多級文件夾。
服務端使用函數:
CreateNamedPipe(); // 創建管道
ConnectNamedPipe(); // 堵塞。等待client連接
client使用函數:
CreateFile(); // 打開(連接)管道
兩方共用函數
WriteFile();
ReadFile(); // 堵塞,使用方便
CloseHandle(); // 關閉管道,斷開連接
server端代碼演示樣例:
#include <stdio.h>
#include <windows.h>
#define PIPE_NAME L"\\.\Pipe\test"
HANDLE g_hPipe = INVALID_HANDLE_VALUE;
int main()
{
char buffer[1024];
DWORD WriteNum;
printf("test server.
");
g_hPipe = CreateNamedPipe(PIPE_NAME, PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE|PIPE_READMODE_BYTE , 1, 0, 0, 1000, NULL);
if(g_hPipe == INVALID_HANDLE_VALUE)
{
printf("Create name pipe failed!
");
goto out;
}
printf("Wait for connect...
");
if(ConnectNamedPipe(g_hPipe, NULL) == FALSE)
{
printf("Connect failed!
");
goto out;
}
printf("Connected.
");
while(1)
{
scanf("%s", &buffer);
if(WriteFile(g_hPipe, buffer, (DWORD)strlen(buffer), &WriteNum, NULL) == FALSE)
{
printf("Write failed!
");
break;
}
}
out:
printf("Close pipe.
");
CloseHandle(g_hPipe);
system("pause");
return 0;
}
client代碼演示樣例:
#include <stdio.h>
#include <windows.h>
#define PIPE_NAME L"\\.\Pipe\test"
HANDLE g_hPipe = INVALID_HANDLE_VALUE;
int main()
{
char buffer[1024];
DWORD ReadNum;
printf("test client.
");
g_hPipe = CreateFile(PIPE_NAME, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (g_hPipe == INVALID_HANDLE_VALUE)
{
printf("Connect pipe failed!
");
goto out;
}
printf("Connected.
");
while(1)
{
if(ReadFile(g_hPipe, buffer, sizeof(buffer), &ReadNum, NULL) == FALSE)
{
break;
}
buffer[ReadNum] = 0;
printf("%s
", buffer);
}
out:
printf("Close pipe.
");
CloseHandle(g_hPipe);
system("pause");
return 0;
}
總結
以上是生活随笔為你收集整理的windows pipe的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gmail技巧之无限别名
- 下一篇: 新研究:全球近七成陆地冰川或在本世纪消融