第123章 名前付きパイプのクライアント側を作る


前章で作ったパイプに書き込みをするプログラムを作ります。



/* 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関数でパイプに書き込みます。(サーバー側で書き込まれた文字列を表示したら イベントは非シグナル状態に戻しています。)

そして、ユーザーの入力を待ちます。

さて、ループを抜けたらファイルハンドルを閉じます。

そして、イベントがシグナル状態になるのを待ちます。

シグナル状態になったらプログラムを終了します。

一つのイベントをサーバー側とクライアント側で利用している点に注意してください。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Feb/26/2006 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。