アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2015年01月26日

いまさらながらの Mailslot

近頃セッション境界を越えてメッセージを送信したい要求が出てきて、やりたいことと仕掛けのバランスがよいものを探していたのだが、ふと、昔読んだ本の内容を思い出し、メールスロットなるものを使ってみた

元々の要求は、異なるプロセスから一方向でメッセージを送信したいというもので、普通にやるなら引数と SendMessage で済む程度の簡単なものなのだったが、セッション境界を越えて渡せないことに気が付き、はたと困ったのであった
こうした欲求を満たすには、大掛かりなものでは TCP で TELNET プロトコルを実装するなどをしてきたのだが、ポートの割り当て問題などがあり、ちょっと面倒
名前付きパイプが妥当そうに見えたのだが、API がごちゃごちゃしていて、あまり使い勝手がよくないと感じた(双方向通信なら、こちらがいいかもしれない)

そこで、一方向で済む、メールスロットを思い出したのだが、そもそもこの機構はかなり古い時代から存在するので、今では DDE のように化石扱いなのではないかと心配になった
API の解説を読む限りは、シンプルで最低限のセキュリティを備えているので、まだまだ現役で使えそうではある

サーバの簡単な実装は以下のようである

HANDLE g_hServer = CreateMailslotW(SERVER_NAME, MESSAGE_SIZE, SERVER_TIMEOUT, NULL);
while (true) {
DWORD cnt = 0;
if (!GetMailslotInfo(g_hServer, NULL, NULL, &cnt, NULL)) {
fprintf(stderr, "GetMailslotInfo failed by %d\n", GetLastError());
break;
}
if (cnt > 0) {
CHAR szMessage[MESSAGE_SIZE+1] = {0};
DWORD dwRead;
OVERLAPPED ovl = {0};
ovl.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
BOOL rc = ReadFile(g_hServer, szMessage, MESSAGE_SIZE, &dwRead, &ovl);
CloseHandle(ovl.hEvent);
if (!rc) {
fprintf(stderr, "ReadFile failed by %d\n", GetLastError());
break;
}
printf("%s\n", szMessage);
}
Sleep(100);
}
CloseHandle(g_hServer);


途中、 if (cnt > 0) としてあるところは、 for (DWORD j = 0; j < cnt; j++) とすべきかもしれない

一方、クライアント側は単純にファイルに書き込むだけでよい
以下のよう

HANDLE hFile = CreateFile(SERVER_NAME, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (INVALID_HANDLE_VALUE == hFile) {
fprintf(stderr, "CreateFile failed by %d\n", GetLastError());
return 1;
}
CHAR szMessage[] = "Hello world";
DWORD dwSize;
if (!WriteFile(hFile, szMessage, strlen(szMessage), &dwSize, NULL)) {
fprintf(stderr, "WriteFile failed by %d\n", GetLastError());
}
CloseHandle(hFile);


実に単純な構成だが、セッション超えには実はもう一つ落とし穴があった





ファン
検索
<< 2015年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
最新記事
最新コメント
タグクラウド
カテゴリアーカイブ
プロフィール
いしちゃんさんの画像
いしちゃん
ブログ
プロフィール
日別アーカイブ
×

この広告は30日以上新しい記事の更新がないブログに表示されております。