windowsの名前はパイプです
個人的な感覚では、windowsの下の命名パイプはあまりにも使いにくいです。
それぞれの名前付きパイプには、システムの名前付きオブジェクトリストに存在する他の名前付きパイプと区別する唯一の名前があります。パイプラインサーバは、CreateNamedPipe()関数を呼び出して、命名パイプの一または複数のインスタンスを作成する際に名前を指定しました。パイプラインクライアントに対しては、CreateFile()またはCallNamedPipe関数を呼び出して、命名されたパイプラインインスタンスを接続するときに、パイプライン名を指定します。名前付き配管の命名規範は郵送槽と似ています。その表示もUNC形式です。
サービス端末の関数:
それぞれの名前付きパイプには、システムの名前付きオブジェクトリストに存在する他の名前付きパイプと区別する唯一の名前があります。パイプラインサーバは、CreateNamedPipe()関数を呼び出して、命名パイプの一または複数のインスタンスを作成する際に名前を指定しました。パイプラインクライアントに対しては、CreateFile()またはCallNamedPipe関数を呼び出して、命名されたパイプラインインスタンスを接続するときに、パイプライン名を指定します。名前付き配管の命名規範は郵送槽と似ています。その表示もUNC形式です。
\\Server\Pipe\[Path]Name
この中で、第一部\\Serverはサーバーの名前を指定しています。名前付きパイプサービスはこのサーバーで作成されます。文字列の部分は小数点以下(本機を表す)、星番号(現在のネットワークフィールド)、ドメイン名または本当のサービスとして表してもいいです。第二部分\Pipeは郵便スロットの\Mail slotと同じように、変更不可能なハードコードの文字列であり、このファイルはNPFSに属していることを指摘する。第三部分\[Path]Nameでは、アプリケーションは、名前付きパイプの名前を一意に定義して識別することができ、マルチレベルディレクトリを設定することができます。サービス端末の関数:
CreateNamedPipe(); //
ConnectNamedPipe(); // ,
クライアント使用関数:CreateFile(); // ( )
共通関数:WriteFile();
ReadFile(); // ,
CloseHandle(); // ,
ビジネスルーチン:#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;
}
クライアントのルーチン:#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;
}