前章で作ったパイプに書き込みをするプログラムを作ります。
/* namedpcl */
#define EVENTNAME "Nekodemowakaru"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
HANDLE hEvent, hFile;
int main()
{
char szBuf[1024];
DWORD dwWritten;
hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, EVENTNAME);
if (hEvent == NULL) {
printf("Error OpenEvent\n");
_getch();
return -1;
}
hFile = CreateFile("\\\\.\\pipe\\mypipe",
GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hFile == INVALID_HANDLE_VALUE) {
printf("パイプをオープンできませんでした\n");
CloseHandle(hFile);
_getch();
return -2;
}
while (1) {
printf("送信文---");
gets(szBuf);
if (strcmp(szBuf, "end") == 0) {
SetEvent(hEvent);
WriteFile(hFile, szBuf, (int)strlen(szBuf), &dwWritten, NULL);
break;
}
SetEvent(hEvent);
WriteFile(hFile, szBuf, (int)strlen(szBuf), &dwWritten, NULL);
}
if (CloseHandle(hFile)) {
printf("ファイルハンドルをクローズしました\n");
}
printf("イベントを待っています...\n");
WaitForSingleObject(hEvent, INFINITE);
printf("イベントがシグナル状態になったので終了します\n");
printf("何かキーを打ってください\n");
_getch();
return 0;
}
まずは、サーバー側で作ったイベントをオープンしてイベントハンドルを取得します。
次に、CreateFile関数でパイプをオープンします。無限ループに突入します。
gets関数で書き込み文字列を取得します。
そして、書き込まれた文字列が「end」ならイベントをシグナル状態にしてループを抜けます。
書き込まれた文字列が「end」でない場合は、やはりイベントをシグナル状態にして、WriteFile関数でパイプに書き込みます。(サーバー側で書き込まれた文字列を表示したら イベントは非シグナル状態に戻しています。)
そして、ユーザーの入力を待ちます。
さて、ループを抜けたらファイルハンドルを閉じます。
そして、イベントがシグナル状態になるのを待ちます。
シグナル状態になったらプログラムを終了します。
一つのイベントをサーバー側とクライアント側で利用している点に注意してください。
Update Feb/26/2006 By Y.Kumei