什么叫做邮槽?
邮槽是一种为了进程间通讯方法的机制。一个使用微软Windows写的应用程序能够在邮槽中存储消息。邮槽的拥有者能够重新找回被存储在邮槽中的消息。典型地,这些消息可以通过一个网络被发送到一个指定的计算机上或者在一个指定网络区域中的全部计算机上。这个域往往是一个工作站或者是一个共享一个组名的服务器。
由于邮槽是基于广播通信机制实现的,因此可以实现一对多的单向通信。我们可以在同一个程序中同时实现客户端和服务器的程序,这样就可以实现双方通信。
邮槽的工作机制:
关键点:邮槽为应用程序提供一种简易的发送和接受简短信息的方法。它们也提供了一种在指定网络区域中全部计算机间的广播式传播能力。
邮槽的命名:
当一个进程创建一个邮槽,这个邮槽的名称必须按照以下格式://./mailslot/[path]name。(类比命名管道)一个邮槽名称需要这些元素:两个反斜杠去开始,一个句点,一个反斜杠跟在句点后,“mailslot”这个关键词和一个反斜杠,但是这些多试不重要的。一个邮槽名前可能加上一个被反斜杠分割的一个或多个伪仿的目录所组成的路径。例如:如果一个用户期望从Bob,Pete和Sue的Taxes消息,这个用户邮槽的应用程序可能允许这个用户去创建单独的邮槽为了各个发送者。
//.mailsolt/taxes/bobs_commnets
//.mailsolt/taxes/petes_commnets
//.mailsolt/taxes/sues_commnets
放入消息到一个邮槽中,一个进程需要打开一个已被命名的邮槽。在本地计算机上往邮槽中写信息,进程就必须要使用创建一个同名的邮槽。但是,这种情况很少。大部分情况下,一个进程用以下格式去写到一个指定的远程计算机上的邮槽上。
//computername/mailsolt/[path]name
在一个给定域名的域中,向每个邮槽中放入消息时,采用以下格式:
//domainname/mailslot/[path]name
在系统主要域中,往一个已有名字的每个邮槽中放入信息,进程可以采用以下格式:
邮槽对象
通过CreateMailslot()函数返回的句柄拥有GENERIC_READ,SYNCHRONIZE和 WRITE_DAC邮槽对象的访问权。
对于邮槽的GENERIC_READ访问权凝聚了STANDARD_RIGHTS_READ为了允许进程从邮槽中读数据,读邮槽的属性和读扩展属性。
邮槽函数
CreateMailslot
函数原型:HANDLE CreateMailslot(LPCTSTR lpName, DWORD nMaxMessageSize, DWORD
说明:创建一个邮路。返回的句柄由邮路服务器使用(收件人)
返回值:Long,如执行成功,返回邮路的句柄;INVALID_HANDLE_VALUE表示失败。会设置GetLastError
参数:
lpName:LPCTSTR,指定邮路的名字,采用的形式如下://./邮路/[路径/]邮路名
nMaxMessageSize:DWORD,指定一个邮路消息的最大长度。零表示无限长。请注意,对于穿越一个网络域到多个邮路的广播消息,最大长度是400
lReadTimeout:DWORD,等待指定的数据时,用这个参数指定邮路使用的默认超时设置,以毫秒为单位。零表示不等待。常数MAILSLOT_WAIT_FOREVER表示一直等到数据到达
lpSecurityAttributes:LPSECURITY _ATTRIBUTES,指定一个结构,或传递零值,表示使用不允许继承的默认描述符
GetMailslotInf0()
函数原型:BOOL GetMailslotInfo(HANDLE hMailslot, LPDWORD lpMaxMessageSize, LPDWORD lpNextSize, LPDWORD lpMessageCount, LPDWORD lpReadTimeout);
说明:获取与一个邮路有关的信息
返回值:Long,非零表示成功,零表示失败。会设置GetLastError
参数:
hMailslot:HANDLE,指定一个邮路的句柄
lpMaxMessageSize:LPDWORD,指定一个长整数变量,用于装载这个邮路的最大消息长度
lpNextSize:LPDWORD,指定一个长整数变量,用于装载下一条消息的长度。如没有消息准备好,则可设为常数MAILSLOT_NO_MESSAGE
lpMessageCount:LPDWORD,指定一个长整数变量,用于装载邮路中准备好的消息数量
lpReadTimeout:LPDWORD,指定一个长整数变量,用于装载邮路的默认阅读超时
SetMailslotInfo()
函数原型:BOOL SetMailslotInfo(HANDLE hMailslot,
说明:设置对一个邮槽读操作的时间。
返回值:如果函数成功,返回值非零;如果函数执行失败,返回值为零。扩展错误信息通过GetLastError函数获得。
参数:
hMailslot:通过CreateMailslot函数创建的识别一个邮槽的句柄
hReadTimeout:按照毫秒,指定时间量。在占休时间前,一个读操作等候着被写入邮槽中的消息。以下值有特定含义:
1.
2.
这个占休时间将应用与全部的并发读操作和全部被继承的邮槽处理。
额外的邮槽服务器使用函数:
1.
2.
3.
4.
例子:
注意:本文转自Windows邮槽,稍加修改。