盛大な独り言日記・自分用メモ2010.11.17~
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
mailslotつづき
GetMailslotInfo について
読み込みを実行する前に、キュー内にメッセージが存在するか確認する関数 なの か
この関数はmailslotキュー内のメッセージの最大の長さとキュー内の次のメッセージの長さ、待ち状態のメッセージの数を返す。
BOOL GetMailslotInfo(
HANDLE mailslot,
LPDWORD maxMsgLen,今のメッセージの最大の長さ
LPDWORD nextMsgLen,次のメッセージの長さ
LPDWORD numMsgs,残りのメッセージがいくつあるのか
LPDWORD readTimeOut
)
サンプルではこの関数をmailslot内にメッセージが存在するかどうかを確認するのに使っている。もし何か(1つでも)存在していれば、この関数は最初のものを読み込む。mailslotから読み込むのとファイルから読み込むのは似ている。
サンプルプログラム宛ての、ネットワーク上にあるどのコンピュータから送られたどのメッセージでも、送り手と受け取り手のmailslot名が一致していれば受信される。
しかしながら、メッセージのサイズに関しては2つの制限がある。
・同じマシン上にある送り手から受け手へ送信されたメッセージは64kバイトまでだが、マシン間でネットワークを介する場合は400kバイトまでとなる。
サンプルの送り手のプログラムは、mailslotがどのようにしてメッセージを送信しているかを示している。
まずCreateFile関数を使う。この関数はmailslotに書き込めるコネクションを作成する。mailslot二何かを書き込むプログラムを作るときに呼び出す。このプログラムは
mailslotクライアントと呼ばれる。なんでかっていうとこれが既にネットワーク上で作動しているmailslotサーバに書き込むことが出来るから。CreateFile関数は特定のmailslotファイル名の利用しているために、(?)mailslotとコミュニケーションを取りたいためにファイルを作っているわけではない事を理解している。
よくわかんないけど普通のファイル作成とは違うって理解しているらしい、多分。
通常使われるファイル名には、異なる4つの型が存在する。
1) \\.\mailslot\[path]name
2) \\*\mailslot\[path]name
3) \\domain\mailslot\[path]name
4) \\machine\mailslot\[path]name
1と4では、nameはローカルとネット上のマシンをそれぞれ特定する。
2では、ローカルマシンのプライマリドメイン(メインの住所?)内での、全てのマシンへの送信操作を特定する。
3では指定されたドメイン内の全てのマシンを特定する。
サンプル内のコードが適切に機能するために、同じマシン内に同じ名前のmailslotをおいておく。
mailslotが開かれると送信プログラムがGetComputerName使ってローカルのパソコンの名前を取得し、この名前を5秒おきに最新のドメイン内の全てのmailslotへ送信し始める。このコードは通常のWriteFile関数を使う。
プログラムを動かす際には、ある書き込み、読み込みペアのどちらの終了の際にも、他のペアを終了させる効果が無い事に注意すること。mailslotプログラムは、たとえどのマシンもメッセージを受け取るためのサーバを構築していなかったとしても、ネットワーク上にパケットを送信することが出来る。また、サーバはどのクライアントの欠如?留守?にも存在できる。いかよくわからない!
受信プログラムは投票?手法(polltechnique)をメッセージを使うのに用いる。毎半秒これはGetMailslotInfo関数を呼び出し、mailslot内でメッセージが待っているかどうか確認する。この手法はいくつかの場合に置いてうまいことうごく。
しかし一般には、マルチスレッドの環境で使われる場合、pollingは良い手法ではない。なぜなら能率が悪いからだ。mailslotを待つ効率的な手法はCreateMailslot関数を呼び出すときにタイムアウトの値を特定する方法である。
間に合わないのでサンプルを打ってきます。日本語で解説してるサイトの方が速いかなあ…
読み込みを実行する前に、キュー内にメッセージが存在するか確認する関数 なの か
この関数はmailslotキュー内のメッセージの最大の長さとキュー内の次のメッセージの長さ、待ち状態のメッセージの数を返す。
BOOL GetMailslotInfo(
HANDLE mailslot,
LPDWORD maxMsgLen,今のメッセージの最大の長さ
LPDWORD nextMsgLen,次のメッセージの長さ
LPDWORD numMsgs,残りのメッセージがいくつあるのか
LPDWORD readTimeOut
)
サンプルではこの関数をmailslot内にメッセージが存在するかどうかを確認するのに使っている。もし何か(1つでも)存在していれば、この関数は最初のものを読み込む。mailslotから読み込むのとファイルから読み込むのは似ている。
サンプルプログラム宛ての、ネットワーク上にあるどのコンピュータから送られたどのメッセージでも、送り手と受け取り手のmailslot名が一致していれば受信される。
しかしながら、メッセージのサイズに関しては2つの制限がある。
・同じマシン上にある送り手から受け手へ送信されたメッセージは64kバイトまでだが、マシン間でネットワークを介する場合は400kバイトまでとなる。
サンプルの送り手のプログラムは、mailslotがどのようにしてメッセージを送信しているかを示している。
まずCreateFile関数を使う。この関数はmailslotに書き込めるコネクションを作成する。mailslot二何かを書き込むプログラムを作るときに呼び出す。このプログラムは
mailslotクライアントと呼ばれる。なんでかっていうとこれが既にネットワーク上で作動しているmailslotサーバに書き込むことが出来るから。CreateFile関数は特定のmailslotファイル名の利用しているために、(?)mailslotとコミュニケーションを取りたいためにファイルを作っているわけではない事を理解している。
よくわかんないけど普通のファイル作成とは違うって理解しているらしい、多分。
通常使われるファイル名には、異なる4つの型が存在する。
1) \\.\mailslot\[path]name
2) \\*\mailslot\[path]name
3) \\domain\mailslot\[path]name
4) \\machine\mailslot\[path]name
1と4では、nameはローカルとネット上のマシンをそれぞれ特定する。
2では、ローカルマシンのプライマリドメイン(メインの住所?)内での、全てのマシンへの送信操作を特定する。
3では指定されたドメイン内の全てのマシンを特定する。
サンプル内のコードが適切に機能するために、同じマシン内に同じ名前のmailslotをおいておく。
mailslotが開かれると送信プログラムがGetComputerName使ってローカルのパソコンの名前を取得し、この名前を5秒おきに最新のドメイン内の全てのmailslotへ送信し始める。このコードは通常のWriteFile関数を使う。
プログラムを動かす際には、ある書き込み、読み込みペアのどちらの終了の際にも、他のペアを終了させる効果が無い事に注意すること。mailslotプログラムは、たとえどのマシンもメッセージを受け取るためのサーバを構築していなかったとしても、ネットワーク上にパケットを送信することが出来る。また、サーバはどのクライアントの欠如?留守?にも存在できる。いかよくわからない!
受信プログラムは投票?手法(polltechnique)をメッセージを使うのに用いる。毎半秒これはGetMailslotInfo関数を呼び出し、mailslot内でメッセージが待っているかどうか確認する。この手法はいくつかの場合に置いてうまいことうごく。
しかし一般には、マルチスレッドの環境で使われる場合、pollingは良い手法ではない。なぜなら能率が悪いからだ。mailslotを待つ効率的な手法はCreateMailslot関数を呼び出すときにタイムアウトの値を特定する方法である。
間に合わないのでサンプルを打ってきます。日本語で解説してるサイトの方が速いかなあ…
PR
この記事にコメントする