无法执行套接字上的操作,因为系统缺少足够的缓冲区空间或队列已满

时间:2017-07-05 06:25:00

标签: c++ networking windows-server-2008-r2 unc

我有一台运行多个应用程序的机器,它们不断执行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。

1 个答案:

答案 0 :(得分:-1)

最终这是由于Microsoft OS错误造成的。由于机器是离线机器,因此不会自动获得定期更新。安装所有操作系统更新解决了这个问题。