5

我正在制作一些使用 NetUseAdd 和 NetUseDel 函数来连接/断开以共享的实用程序。在 Windows 7 中,我注意到在调用 NetUseDel 和真正的断开连接之间经过了将近 12 秒。我进行了一些调查,发现 net use \server /del 也仅在 12 秒后断开连接。这是小脚本和 Wireshark 输出,对应于脚本的运行:

net use \\server "" /user:""
net use \\server /delete

http://i.stack.imgur.com/5CyCw.png

设置 last tree connect smb 命令作为参考,我们可以看到,树断开延迟了 12 秒。

有谁知道如何减少这样的超时?

4

3 回答 3

2

连接有时甚至可以超过 12 秒。诀窍是在删除后强制登录错误。

如果您强制登录错误,则共享将立即无法访问。我们可以使用本地访客帐户(它通常会给出错误“登录失败:帐户当前已禁用。”即使启用它也无法访问)。

而不仅仅是:

net use \\server /delete

我们将执行:

net use \\server /delete
net use \\server "" /user:"Guest"
net use \\server /delete 2>nul

第三行是在访客登录成功的情况下执行的(它使用2>nul将错误流重定向到 nul 设备,以避免显示任何错误消息)。

这是使用“net use”命令的批处理版本,但是当使用 netapi32.dll 中的 NetUseAdd 和 NetUseDel 或 mpr.dll 中的 WNetAddConnection 和 WNetCancelConnection 时,可以应用相同的解决方案。

于 2017-07-03T07:56:05.007 回答
0

为什么要延迟断开连接?超时的全部意义在于缓存共享,因为 Windows 知道如果您访问共享一次,您可能会再次这样做。它不想浪费时间不断地建立和拆除一个很容易打开的连接,所以它会延迟关闭它。

如果您需要访问共享,那么这将对您有所帮助。不要担心删除它,以便您可以重新创建它;就用它。

于 2011-07-05T12:58:29.643 回答
0

由于 SMB 客户端内核驱动程序处理这些请求,您无法控制它何时实际断开连接,因此您遇到的 12 秒延迟实际上只是内核处理程序终止底层 tcp 连接所用的时间。作为一种解决方法,我将使用NetUseEnum来验证连接是否在带有计数器的 while 循环中被实际删除。

您可以在此处查看我的答案,以获取有关如何创建多个连接的更多信息,而不是使用另一个 smb 实现或为每个连接创建一个 Windows 工作站,您不走运。

于 2017-04-24T08:23:45.047 回答