Win32API 名前付きパイプによるプロセス間通信 CreateNamedPipe
Win32APIで名前付きパイプを用いてプロセス間通信を行う
使用するAPI
CreateNamedPipeについて
HANDLE CreateNamedPipe( LPCTSTR lpName, // パイプ名 DWORD dwOpenMode, // パイプを開くモード DWORD dwPipeMode, // パイプ固有のモード DWORD nMaxInstances, // インスタンスの最大数 DWORD nOutBufferSize, // 出力バッファのサイズ DWORD nInBufferSize, // 入力バッファのサイズ DWORD nDefaultTimeOut, // タイムアウトの間隔 LPSECURITY_ATTRIBUTES lpSecurityAttributes // セキュリティ記述子 );
dwOpenMode
| PIPE_ACCESS_DUPLEX | 双方向のパイプ |
| PIPE_ACCESS_INBOUND | データの流れは、クライアントからサーバーへの方向に限定される |
| PIPE_ACCESS_OUTBOUND | データの流れは、サーバーからクライアントへの方向に限定される |
サーバー側
#include <string.h>
#include <stdio.h>
#include <windows.h>
int main()
{
HANDLE hPipe;
char szBuff[256];
DWORD dwNumberOfBytesRead;
hPipe = CreateNamedPipe("\\\\.\\pipe\\mypipe", //lpName
PIPE_ACCESS_DUPLEX, //dwOpenMode
PIPE_TYPE_BYTE | PIPE_WAIT, //dwPipeMode
3, //nMaxInstances
0, //nOutBufferSize
0, //nInBufferSize
100, //nDefaultTimeOut
NULL); //lpSecurityAttributes
if (hPipe == INVALID_HANDLE_VALUE) {
return 1;
}
if (!ConnectNamedPipe(hPipe, NULL)) {
CloseHandle(hPipe);
return 1;
}
while (1) {
if (!ReadFile(hPipe,
szBuff,
sizeof(szBuff),
&dwNumberOfBytesRead, NULL)) {
break;
}
szBuff[dwNumberOfBytesRead] = '\0';
printf("PipeServer: %s", szBuff);
}
FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
return 0;
}クライアント側
#include <string.h>
#include <stdio.h>
#include <windows.h>
int main()
{
HANDLE hPipe;
char szBuff[32];
DWORD dwNumberOfBytesRead;
DWORD dwNumberofBytesWritten;
hPipe = CreateFile("\\\\.\\pipe\\mypipe",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hPipe == INVALID_HANDLE_VALUE) {
return 1;
}
while (1) {
fgets(szBuff, sizeof(szBuff)/sizeof(szBuff[0]), stdin);
if (!WriteFile(hPipe, szBuff, strlen(szBuff), &dwNumberofBytesWritten, NULL)) {
break;
}
}
CloseHandle(hPipe);
return 0;
}
1.まず、サーバー側を起動してパイプを作成する
2.クライアントを実行する。
3.クライアントのコンソールから文字列を入力して、文字列がサーバー側のコンソールに表示されればパイプでのデータ通信が成功している。