使用Delphi写入远程计算机上的邮件槽

时间:2014-12-10 15:47:06

标签: winapi mailslot

我已经阅读了关于邮件的所有内容,但仍然留下了写入邮箱的问题,邮箱已经被另一台计算机上的邮件服务器打开了。

我在相同计算机上的邮件槽没有问题。例如,如果我尝试写入本地计算机上的邮件槽,如下所示:

var
  sMsg: string;
  iBytes: DWORD;
begin
  SlotName := '\\.\mailslot\testslot';
  Handle := CreateFile(PChar(SlotName), GENERIC_WRITE, FILE_SHARE_READ, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  Result := WriteFile(Handle, sMsg[1], Length(sMsg), iBytes, nil);
end;
如果邮件服务器程序尚未创建邮件槽,

CreateFile将失败并且文件不存在错误代码。

但是,如果我将类似\\MYSERVER\mailslot\testslot的内容传递给邮件名称,则始终将返回有效的文件句柄。即使计算机名称无效,它仍会返回文件句柄,然后WriteFile也会成功。

如果计算机名不正确或者该计算机上的邮件服务器没有创建邮件槽,我希望CreateFile失败,但似乎并非如此,似乎只是这种情况在本地计算机上写邮件时。

有人可以启发我吗?

1 个答案:

答案 0 :(得分:3)

CreateFile() documentation州:

  

邮筒

     

如果CreateFile打开邮件槽的客户端,如果邮件服务器客户端在邮件服务器使用CreateMailSlot函数创建它之前尝试打开本地邮件槽,则该函数返回INVALID_HANDLE_VALUE。

这意味着CreateFile()无法验证是否存在远程邮件槽,只能验证本地邮件槽。这与您所看到的行为一致。 Windows可以轻松验证是否存在本地邮件槽,但无法验证是否存在远程邮件槽。当您考虑使用 datagrams (aka,UDP)实现邮件槽时,这是有意义的。 UDP无法知道远程目标是否存在。它所能做的只是在网络上放一个数据包,希望它到达目的地。这在Mailslot documentation

中表示为nuch
  

一个重要的考虑因素是 mailslots使用数据报广播消息。数据报是网络沿线发送的一小部分信息。像广播或电视广播一样,数据报不提供收据确认;没有办法保证收到数据报。就像山脉,大型建筑物或干扰信号可能导致收音机或电视信号丢失一样,有些事情可能会阻止数据报到达特定的地方。目的地。

这就是为什么CreateFile()WriteFile()在远程邮件槽不存在时不会失败的原因。他们根本不知道这种或那种方式。