·
邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输
·
邮槽是一种单向通信机制,创建邮槽的服务器进程读取
数据,打开邮槽的客户机进程写入数据
·
为保证邮槽在各种
Windows
平台下都能够正常工作,我们传输消息的时候,应将消息的长度限制在
424
字节以下
邮槽提供一种进程间通讯能力的方法。任何进程都可以创建一个邮槽,并成为一个邮槽服务器。其它调用邮槽的客户机进程能够通过邮槽名获得对这个邮槽的访问,并发送消息到邮槽服务器上。一个进程即可以当作邮槽服务器,也可以当作邮槽客户机,所以用多个邮槽来实现双向进程间通讯是可能的。
引入的信息经常被添加到邮槽中。邮槽保存这个消息直到创建进程有机会去读取它们。
除了为了有稍许简单化设计界面和附件在指定的网络域中为了在全部计算机中实现广播传送消息的能力之外,邮槽类似于命名管道。一个邮槽客户机能够发送消息到向一个本地计算机上的一个邮槽上,或者发送到其它计算机上的一个邮槽上,或者发送到在指定计算机区域中同名的全部邮槽上。广播到域上的消息不能够超过
400
个字节;被发送到一个单一的邮槽上的消息长度仅被限定在创建邮槽的人指定的最大消息长度。
关键点:邮槽为应用程序提供一种简易的发送和接受简短信息的方法。它们也提供了一种在指定网络区域中全部计算机间的广播式传播能力。
什么叫做邮槽?
邮槽是一种为了进程间通讯方法的机制。一个使用微软
Windows
写的应用程序能够在邮槽中存储消息。邮槽的拥有者能够重新找回被存储在邮槽中的消息。典型地,这些消息可以通过一个网络被发送到一个指定的计算机上或者在一个指定网络区域中的全部计算机上。这个域往往是一个工作站或者是一个共享一个组名的服务器。
邮槽的命名
当一个进程创建一个邮槽,这个邮槽的名称必须按照以下格式:
//./mailslot/[path]name
。一个邮槽名称需要这些元素:两个反斜杠去开始,一个句点,一个反斜杠跟在句点后,“
mailslot
”这个关键词和一个反斜杠,但是这些多试不重要的。一个邮槽名前可能加上一个被反斜杠分割的一个或多个伪仿的目录所组成的路径。例如:如果一个用户期望从
Bob
,
Pete
和
Sue
的
Taxes
消息,这个用户邮槽的应用程序可能允许这个用户去创建单独的邮槽为了各个发送者。
放入消息到一个邮槽中,一个进程需要打开一个已被命名的邮槽。在本地计算机上往邮槽中写信息,进程就必须要使用创建一个同名的邮槽。但是,这种情况很少。大部分情况下,一个进程用以下格式去写到一个指定的远程计算机上的邮槽上。
在一个给定域名的域中,向每个邮槽中放入消息时,采用以下格式:
在系统主要域中,往一个已有名字的每个邮槽中放入信息,进程可以采用以下格式:
邮槽对象
通过
CreateMailslot
函数返回的句柄拥有
GENERIC_READ,SYNCHRONIZE
和
WRITE_DAC
邮槽对象的访问权。
对于邮槽的
GENERIC_READ
访问权凝聚了
STANDARD_RIGHTS_READ
为了允许进程从邮槽中读数据,读邮槽的属性和读扩展属性。
邮槽函数
| |||||
| |||||
| |||||
额外的邮槽服务器使用函数:
1.
DuplicateHandle
;复制邮槽句柄。
2.
ReadFile
:从邮槽中返回消息。
3.
GetFileTime
:返回一个邮槽被创建的日期和时间。
4.
SetFileTime
:设置一个邮槽被创建的日期和时间。
|
例子:
服务器端:
void OnMailslotRecv()
{
HANDLE hMail;
HMail = CreateMailslot(“.//mailslot//MyMail”,0,MAILSLOT_VAIT_FOREVER,NULL);
If (INVALID_HANDLE_VALUE==hMail)
{
MessageBox(“Create Mailslot failed!”);
Return;
}
char buf[100] = “0”;
DWORD dwRead;
If (!ReadFile(hMail, buf, 100, &dwRead, NULL))
{
MessageBox(“Failed read data from file!”)
CloseHandle(hMail);
Return;
}
MessageBox(buf);
CloseHandle(hMail);
}
客户端:
void OnMailslotSend()
{
HANDLE hMail;
hMail = CreateFile(.//mailslot//MyMail,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
If (INVALID_HANDLE_VALUE==hMail)
{
MessageBox(“Open mailslot failed!”);
Return;
}
char buf[100] = “Mailslot test Program!”;
DWORD dwWrite;
If (!ReadFile(hMail, buf, 100, & dwWrite, NULL))
{
MessageBox(“Failed write data to file!”)
CloseHandle(hMail);
Return;
}
CloseHandle(hMail);
}