FC2ブログ

[Win23API] メールスロット動作検証サンプル

 メールスロットのサンプル。

 「セッション 0 の分離」対応に使えるかどうかを検証するために使用。

 使い方は、ビルドモジュールのインスタンスを二つ立ち上げる。/sスイッチを付けた方がメールスロットサーバで、/cスイッチを付けた方はクライアントとして動作する。

 /sをつけて実行したメールスロットサーバは、クライアントからの書き込みを待機する。

 /cを付けて実行したクライアントは、"Test."という文字列をポストする。

 メールスロットサーバは、ポストを受信したらポストされた内容(=Test.")をコンソールに表示する。

#pragma once
#include

int main(int argc, char* argv[])
{
    int idx=1;
    bool bModeSvr=false;
    bool bModeCli=false;
    HANDLE hMailSlot;

    HANDLE hStdOut=::GetStdHandle(STD_OUTPUT_HANDLE);

    while(argc>idx)
    {
        if(strncmp(argv[idx],"/s",2)==0)
        {
            bModeSvr=true;
        } else if(strncmp(argv[idx],"/c",2)==0)
        {
            bModeCli=true;
        } else
        {
            char buffer[128];
            DWORD dwWrittenLen=0;

            wsprintf(buffer,"Parameter <%s> is invalid.\n\0",argv[idx]);
            WriteConsole(hStdOut,buffer,strlen(buffer),&dwWrittenLen,NULL);

            return -1;
        }
        idx++;
    }

    if(bModeSvr&&(!bModeCli))
    {
        DWORD dwReadLen=0;
        DWORD dwMaxSize,dwNextSize,dwCount,dwTimeout;
        DWORD dwWrittenLen=0;
        char buffer[128];

        buffer[0]='\0';

        hMailSlot=::CreateMailslot("\\\\.\\mailslot\\SampleMailSlot\0",1024,MAILSLOT_WAIT_FOREVER,NULL);
        if( hMailSlot==INVALID_HANDLE_VALUE    ||
            hMailSlot==NULL    )
        {
            DWORD dwError=::GetLastError();
            wsprintf(buffer,"[Server] Function <%s> error. Code(%d).\n\0","CreateMailslot",dwError);

            WriteConsole(hStdOut,buffer,strlen(buffer),&dwWrittenLen,NULL);
        } else
        {
            wsprintf((LPTSTR)buffer,"[Server] Waiting for mailslot data...\n\0");
            WriteConsole(hStdOut,buffer,strlen(buffer),&dwWrittenLen,NULL);

            ::GetMailslotInfo(hMailSlot,&dwMaxSize,&dwNextSize,&dwCount,&dwTimeout);
            ::ReadFile(hMailSlot,buffer,sizeof(buffer),&dwReadLen,NULL);

            WriteConsole(hStdOut,"[Server] Received : ",strlen("[Server] Received : "),&dwWrittenLen,NULL);
            WriteConsole(hStdOut,buffer,strlen(buffer),&dwWrittenLen,NULL);
        }
    } else if((!bModeSvr)&&bModeCli)
    {
        DWORD dwWrittenLen=0;
        char buffer[128];

        wsprintf(buffer,"Test.\n\0");
        hMailSlot=::CreateFile("\\\\*\\mailslot\\SampleMailSlot\0",GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
        if(hMailSlot==NULL)
        {
            DWORD dwError=::GetLastError();
            wsprintf(buffer,"[Client] Function <%s> error. Code(%d).\n\0","CreateFile",dwError);
            WriteConsole(hStdOut,buffer,strlen(buffer),&dwWrittenLen,NULL);
        } else
        {
            if(!WriteFile(hMailSlot,buffer,sizeof(buffer),&dwWrittenLen,NULL))
            {
                DWORD dwError=::GetLastError();
                wsprintf(buffer,"[Client] Function <%s> error. Code(%d).\n\0","WriteFile",dwError);
                WriteConsole(hStdOut,buffer,strlen(buffer),&dwWrittenLen,NULL);
            }else
            {
                WriteConsole(hStdOut,"[Client] Sent : ",strlen("[Server] Sent : "),&dwWrittenLen,NULL);
                WriteConsole(hStdOut,buffer,strlen(buffer),&dwWrittenLen,NULL);
            }
        }
    }
    return 0;
}
スポンサーサイト



theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

comment

管理者にだけメッセージを送る

カレンダー
11 | 2019/12 | 01
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
最近の記事
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
いろいろリンクボタン
埋め込みe-Words