我已经阅读了关于邮件的所有内容,但仍然留下了写入邮箱的问题,邮箱已经被另一台计算机上的邮件服务器打开了。
我在相同计算机上的邮件槽没有问题。例如,如果我尝试写入本地计算机上的邮件槽,如下所示:
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
失败,但似乎并非如此,似乎只是这种情况在本地计算机上写邮件时。
有人可以启发我吗?
答案 0 :(得分:3)
邮筒
如果CreateFile打开邮件槽的客户端,如果邮件服务器客户端在邮件服务器使用CreateMailSlot函数创建它之前尝试打开本地邮件槽,则该函数返回INVALID_HANDLE_VALUE。
这意味着CreateFile()
无法验证是否存在远程邮件槽,只能验证本地邮件槽。这与您所看到的行为一致。 Windows可以轻松验证是否存在本地邮件槽,但无法验证是否存在远程邮件槽。当您考虑使用 datagrams (aka,UDP)实现邮件槽时,这是有意义的。 UDP无法知道远程目标是否存在。它所能做的只是在网络上放一个数据包,希望它到达目的地。这在Mailslot documentation:
一个重要的考虑因素是 mailslots使用数据报广播消息。数据报是网络沿线发送的一小部分信息。像广播或电视广播一样,数据报不提供收据确认;没有办法保证收到数据报。就像山脉,大型建筑物或干扰信号可能导致收音机或电视信号丢失一样,有些事情可能会阻止数据报到达特定的地方。目的地。
这就是为什么CreateFile()
和WriteFile()
在远程邮件槽不存在时不会失败的原因。他们根本不知道这种或那种方式。