none
MailSlotの送信データ制限に付いて RRS feed

  • 質問

  • お世話に成ります。WindowsXPでMailSlotを使って隣のマシンと通信通信したいのですが、

    書込みデータが多くなると送信できません。

    テストプログラムで、16Byteから初めて400Byte位までは

    問題無く受信できるのですが、500バイトにすると受信できません。

    MailSlotで大きなデータを送信しようとした時、何か設定が必要なのでしょうか?

    宜しくお願い致します。

    2013年8月6日 11:31

回答

すべての返信

  • About Mailslotsから引用

    The data in a mailslot message can be in any form, but cannot be larger than 424 bytes when sent between computers.
    To send messages that are larger than 424 bytes between computers, use named pipes or Windows Sockets instead.
    2013年8月6日 23:06
  • 佐祐里さん有難うございます。

    作成しているプログラムは、改造部分でWindowsNTで動作していた物です。

    動作していた・・現在も現場で動作しているので、Win7対応に改造しようとして書き込みが出来ないので困っています。

    以下の情報が有りますが、私のプログラムは、相手マシンを指定して書き込みを行っています。

    \\computername\mailslot\名 の形式で行っています。

    また、書き込み処理はエラーと成らないで正常に終わってしまいます。

    CreateMailslot に以下の内容が有ります。

    Windows7に関する情報は探す事が出来ていません。

    Windows7で仕様が変わったのでしょうかね?

    他に情報が有りましたら、宜しくお願い致します。

    >>>>>>>

    CreateFileドメインを指定します、アスタリスク形式を使用して、システムのプライマリ ドメインを指定する場合、アプリケーションは、メール スロットに一度にの 424 バイト以上を書き込むことができません。これを行うにしようとすると、アプリケーション、 WriteFile関数は失敗し、 GetLastErrorを返します ERROR_BAD_NETPATH。

    ・・・・・・・・・・・・・・・・・・・

    対応情報
    Windows NT/2000:Windows NT 3.1 以降
    Windows 95/98:Windows 95 以降
    ヘッダーファイル:Winbase.h 内で宣言、Windows.h をインクルード
    インポートライブラリ:Kernel32.lib を使用
    Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装

    <<<<<<<<


    2013年8月7日 3:00
  • 横から失礼します。

    メールスロットは、その仕様から想像できるようにデータグラム(UDP)を
    使って実装されていると考えられます。
    データグラム(UDP)である以上、データの到達は(完全には)保障されません。
    つまり、データの到達が保障されなくても問題ないシステムか、
    それを補完できるシステムか、又はデータの厳密性を保障しない
    システムでしか使用できません。

    データの到達が完全に保障されなければならない場合は、
    名前付きパイプなど、TCP/IPソケットによる通信で実装しなければなりません。
    佐祐理さんの引用部分は暗にそのことを示唆しているようにも感じますが、
    レドモンドの連中はもっと明確な注釈をすべきだったかも知れません。

    2013年8月7日 5:22
  • そのドキュメントはメンテナンスされておらず、主にWindows 2000、+αでxpまでしか記述されていません。

    CreateMailslot functionを参照すべきなのですが、こちらにも同じことが記載されていました。またMailslotそのものについて非推奨などの記述も見つかりませんでした。つまりエラーが発生しないのは何かしらのバグの可能性が高いです。なおWriteFile()のlpNumberOfBytesWrittenは何バイト書き込まれたと報告しているのでしょうか?

    また[SDK32] Win95のメールスロットは 4093 バイトまでというドキュメントを見つけたので、いつの間にか削減されたのかもしれません。
    # ただし現在MSDNライブラリに記載されているのはWindows 2000以降の情報なので、それ以前に削減されていたのであれば記述が削除されていてもわかりません。

    • 回答の候補に設定 星 睦美 2013年8月7日 8:13
    2013年8月7日 5:40
  • 文書番号: 819107 http://support.microsoft.com/kb/819107
    の詳細のメモ欄に
    We do not recommend using mailslot programs.
    の記述があるようです。まぁ、所詮メモですけどね(vv;)。
    • 編集済み 仲澤@失業者 2013年8月7日 6:13
    • 回答としてマーク 蜻蛉 2013年8月7日 7:13
    • 回答としてマークされていない 蜻蛉 2013年8月7日 7:13
    • 回答としてマーク 蜻蛉 2013年8月7日 10:49
    2013年8月7日 6:05
  • 仲澤@失業者さん有難うございます。

    メールスロットは諦めようと思っていますが、

    現在WinNTで動作しているようなので

    WinXpで何故動作しないのか不思議です。

    有難うございました。

    2013年8月7日 6:44
  • 佐祐理さん有難うございます。

    Win95から書き込みは、制限が有るとの情報はどこかで見ました。

    それ以降のWindowsバージョンでは、62000Byteと書かれた情報も有りました。

    私がWinNtからWin7に乗せ換えようとしているプログラムは、

    WinNTで動作しているので良く解りませんね。

    一旦XPで動作させて、Win7に修正しようとしたのですが

    Xpで動作しなくて色々調べましたが情報が少ないですね。

    諦めて、UDPで書き換えるつもりです。

    有難うございました。

    2013年8月7日 6:51
  • 佐祐理さん 追記です

    聞かれたことに応えていませんでした。

    申し訳ありません。

    WriteFile()で書込みバイト数は指定した4064バイトと返ってきています。

    だから、余計に解らなくなってました。

    有難うございました。

    2013年8月7日 6:56
  • 仲澤@失業者さん有難うございます。

    Win2Kから使用変わってるんですね・・・・・

    もう、悩んでも仕方ないですね。

    有難うございました。

    >>>>>>>>

    クライアントとサーバーのメール スロット プログラム Windows 2000 を実行している場合は、データが 426 バイトを超えるいる場合は、サーバー プログラムのデータ クライアント プログラムから受け取りません。この動作は、Windows 2000 における設計です。メール スロットのプログラムは、Windows 2000 ベースのクライアントから、Windows 2000 ベースのサーバーに 426 バイトを超えるを送信するには使用できませんので、パイプや Windows Sockets (winsock) より多くのデータは名前付きです。

    <<<<<<<<<

    2013年8月7日 7:05
  • みなさん有難うございました。

    ところで・・・この質問閉めるのはどうしたら良いのでしょうか?

    2013年8月7日 7:16
  • フォーラム オペレーターの星 睦美です。
    tonbo1 さん、こんにちは

    佐祐理 さんからの返信が関連した情報を探す手助けになっていると思いますので、私から[回答の候補に設定] させていただきました。

    (今回はWindows NT に関して、ということで情報が少なく解決にはいたりませんでしたが)
    質問したい内容が解決できた場合には、これからもコミュニティのユーザー同士での情報交換がより活発に行われるように参考になった回答に[回答としてマーク] をいただければ幸いです。

    それでは今後ともMSDN フォーラムをお役立てください。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年8月7日 8:21