 前章で作ったパイプに書き込みをするプログラムを作ります。
前章で作ったパイプに書き込みをするプログラムを作ります。
/* 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