2007年12月20日木曜日

[.NET]MailSlot

最近、過去の資産(今となってはレガシーな物)のリプレースをやっています。
で、そのシステムのなでMailSlotを使った通信をしていました。そこで送信・受信のドライバを作ろうと思って.NET Frameworkのライブラリを探したのですが、それらしいものが見つからず、仕方なく自作しました。
とりあえず、受信まちの場合、以下のようなコードで実現可能です。送信側はまた後日。

通常、CreateMailslotしたハンドルに対してCloseHandleする必要があるのですが、FileStream.close()がそれらしく処理してくれるっぽい。

[DllImport("kernel32.dll"CharSet = CharSet.Auto)]
static extern SafeFileHandle CreateMailslot(
    string lpName,
    uint nMaxMessageSize,
    uint lReadTimeout,
    IntPtr lpSecurityAttributes);

/// <summary>
/// メールスロット受信待ち
/// </summary>
/// <param name="maxMessageSize">最大メッセージ数</param>
/// <param name="readTimeout">タイムアウト</param>
public string ReadMailSlot(string slotuint maxMessageSizeuint readTimeout)
{
    string result = string.Empty;
    SafeFileHandle mailslotHandle = null;
    try
    {
        mailslotHandle = CreateMailslot(slotmaxMessageSizereadTimeout, (IntPtr)0);

        using (FileStream fs = new FileStream(mailslotHandleFileAccess.Read))
        {
            byte[] buf = new byte[maxMessageSize];
            int len = fs.Read(buf0buf.Length);
            result = Encoding.UTF8.GetString(buf0len);

            fs.Close();
        }

    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        System.Diagnostics.Debug.WriteLine(ex.StackTrace);
        throw ex;
    }
    return result;
}


検索で結構ヒットしているようなので、その後のblogへリンクを追加

GDD Blog: [.NET]MailSlot(その2)
GDD Blog: [.NET]MailSlot(その3)

0 件のコメント: