我有一台运行多个应用程序的机器,它们不断执行UNC访问(\\server-ip\share
),所以:
std::ifstream src(fileName, std::ios::binary);
std::ofstream dst(newFileName, std::ios::binary);
CopyFromRemote(ifstream &src, ofstream &dst);
dst.flush();
dst.close();
src.close();
void CopyFromRemote(ifstream src, ofstream dst)
{
char buffer[8192]; // read 8KB each chunk
while (src.read(buffer, sizeof(buffer)))
{
dst.write(buffer, sizeof(buffer));
// Here there is code that checks that some timer !> max read time so as
// to not be stuck if there is network issue with this src.
}
if (src.eof() && src.gcount() > 0)
{
dst.write(buffer, src.gcount()); // few bytes left
}
}
可以看出,网络因每个8KB(文件大小为几MB)遍历它而非常紧张。这里的好处是能够在特定来源花费太长时间的情况下中止文件副本。
我面临的问题是几天之后所有UNC都无法从这台机器上访问,错误如上。我不确定问题的根源是什么,但它是零星的&难以指甲。当问题发生时,第1行失败(std :: ifstream src ...)。 telnet 也停止工作。
另外:杀死应用程序时,UNC可以再次访问。重新启动进程时,UNC立即无法再次访问。重启机器可以解决问题几天。
最初我认为它是Port exhaustion但是netstat
没有显示太多连接或挂起连接,并且任务管理器性能选项卡不显示异常数字。 TcpQry显示正常的TCP / UDP映射数。
此外:数据包捕获显示问题发生时没有请求(请求未到达网络)。事件查看器不会显示任何内容。是否注意了注册表更改,虽然这可能只是延迟问题而不是消除它,但无论如何它没有帮助:
在autodisconnect
中找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
值。如果不存在,请创建一个名为REG_DWORD
的新autodisconnect
。将值编辑为十六进制并将其设置为ffffffff
。
在KeepConn
中查找HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanworkstation\parameters
。如果它不存在,则将其创建为REG_DWORD
值,并为其指定值65534。
查找HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
并创建名为DWORD
的新MaxUserPort
值。将值设置为65534。
答案 0 :(得分:-1)
最终这是由于Microsoft OS错误造成的。由于机器是离线机器,因此不会自动获得定期更新。安装所有操作系统更新解决了这个问题。