背景
業務で新規のWindowsデスクトップアプリケーションを作成することになりました。既存の他システムとの連携が前提ですが、その通信方法がMailslotによる通信だったために新規アプリケーションでもMailslotを送受信できるようにしなければならなくなりました。
そもそもMailSlotsとは
Microsoftのドキュメントには以下のように記載があります。
https://learn.microsoft.com/ja-jp/windows/win32/ipc/mailslots
mailslot は、一方向のプロセス間通信 (IPC) のメカニズムです。アプリケーションは、mailslot にメッセージを格納できます。 mailslot の所有者は、そこに格納されているメッセージを取得できます。 通常、これらのメッセージは、指定したコンピューターまたは指定したドメイン内のすべてのコンピューターにネットワーク経由で送信されます。プロセス間通信には、mailslot の代わりに名前付きパイプまたは Windows ソケットを使用できます。 (一部抜粋)
MailSlotを利用する場合には上記にもあるようにコンピューター名もしくはホスト名を指定する必要があります。詳細は以下のURLを参照ください。
https://learn.microsoft.com/ja-jp/windows/win32/ipc/mailslot-names
今回発生した問題
今回の場合、他システムが別のネットワークセグメントに属していたため、MailSlotでの通信ができない(MailSlotを送信しても受信できない)状態になりました。
解決法
今回通信できない問題をクリアするために以下の二つの対応を行いました。
(1)NetBIOS over TCP/IPをONにする。
以下のサイトを参考にしました。
https://wiki.mcneel.com/ja/zoo/writemailsloterror
(2)lmhostファイルを作成する。
今回のセグメントを超えられない原因はこれでした。どうやらMailSlot(NetBIOS over TCP/IPの通信)でネットワークセグメントを超える場合はhostsファイルによる名前解決が出来ないようで、セグメント外のホストを見つけることができませんでした。なので対処としてはNetBIOS over TCP/IPの通信で名前解決が出来るようにlmhostsファイルを「%windir%\system32\drivers\etc」に作成しました。
以下のサイトを参考にしました。
https://emuyama.cocolog-nifty.com/emulog/2004/08/hostslmhosts_bff5.html
まとめ
現在の世の中でMailSlotが使用されているシステムはごくわずかなような気もしますが、もしMailSlot(NetBIOS over TCP/IPの通信)でネットワークセグメントを超えなければならない場合はlmhostsファイルを作成しましょう。