で、そのシステムのなで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 slot, uint maxMessageSize, uint readTimeout)
{
string result = string.Empty;
SafeFileHandle mailslotHandle = null;
try
{
mailslotHandle = CreateMailslot(slot, maxMessageSize, readTimeout, (IntPtr)0);
using (FileStream fs = new FileStream(mailslotHandle, FileAccess.Read))
{
byte[] buf = new byte[maxMessageSize];
int len = fs.Read(buf, 0, buf.Length);
result = Encoding.UTF8.GetString(buf, 0, len);
fs.Close();
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
System.Diagnostics.Debug.WriteLine(ex.StackTrace);
throw ex;
}
return result;
}
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 slot, uint maxMessageSize, uint readTimeout)
{
string result = string.Empty;
SafeFileHandle mailslotHandle = null;
try
{
mailslotHandle = CreateMailslot(slot, maxMessageSize, readTimeout, (IntPtr)0);
using (FileStream fs = new FileStream(mailslotHandle, FileAccess.Read))
{
byte[] buf = new byte[maxMessageSize];
int len = fs.Read(buf, 0, buf.Length);
result = Encoding.UTF8.GetString(buf, 0, len);
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 件のコメント:
コメントを投稿