c - 使用 Vix 发送到虚拟机的命令序列有时会失败

标签 c wrapper vmware cpython vix

我创建了一个名为 listProcesses 的函数它按以下顺序调用以下 Vix 命令:

  1. VixHost_Connect
  2. VixHost_OpenVM
  3. VixVM_LoginInGuest
  4. VixVM_ListProcessesInGuest
  5. VixVM_LogoutFromGuest
  6. VixHost_Disconnect

请注意,我没有调用 VixVM_PowerOn因为我是手动启动虚拟机的。

函数listProcesses()是用 C 编写的,但我将其导出为 .pyd与 Python 一起使用的文件。

在 Python 解释器中,我运行以下代码:

from myModule import listProcesses

for i in xrange(1000):
    print listProcesses()

函数listProcesses()为我提供 for 的前 30 次迭代的预期输出(表示虚拟机内运行的进程名称的字符串列表)循环,但之后它开始打印一个空列表。

我使用 Visual Studio 2012 中的调试器进行调查,看起来像是 for 的约 30 次迭代之后。循环,函数VixVM_LoginInGuest()返回错误3006 。从 Vix 文档来看,该错误意味着“虚拟机需要打开电源。”。

我已检查,虚拟机已启动并响应,并且 VmwareTools 仍在虚拟机内运行。

我想补充一点,我按照文档的建议释放了所有句柄。 另外,如果有任何帮助的话,如果我在开始收到错误后暂停 python 脚本的执行并重新启动虚拟机,则脚本将开始打印另一个 ~30 的预期输出(取决于我运行的主机) script in 中,可能会多达 80) 次,然后又开始打印一个空列表。

我想了解一下为什么会出现这个问题。

编辑: 经过进一步调查,我注意到函数 VixHost_OpenVM创建到虚拟机的 TCP 连接,并且该连接永远不会关闭。当连接数量达到一定数量时,操作系统可能会禁止来 self 的脚本的任何新连接。有没有办法在不关闭脚本的情况下关闭未使用的连接?

最佳答案

我已经找到了我的问题的答案,由于看起来没有人会回答它,所以我将自己为将来可能遇到此问题的人发布答案。

问题是我每次运行该函数时都会调用 VixHost_Connect,因此函数 VixHost_OpenVM 会创建一个到虚拟机的新 (TCP) 连接每次。经过几次调用后,我将达到操作系统施加的 TCP 连接限制,并且对 VixHost_OpenVM 的进一步调用将失败。

解决方案是在initmodule()函数中调用函数VixHost_Connect,并将句柄存储为其他方法可以使用的全局变量。完成此操作后,我的 listProcesses() 函数如下所示:

  1. VixHost_OpenVM
  2. VixVM_LoginInGuest
  3. VixVM_ListProcessesInGuest
  4. VixVM_LogoutFromGuest

因为我每次运行 listProcesses() 时都对 Vmware 使用相同的句柄,所以只有在虚拟机的 TCP 连接尚不存在时才会创建该连接,并且我可以将该函数调用为我想多次。

关于c - 使用 Vix 发送到虚拟机的命令序列有时会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16168692/

相关文章:

c++ - JsonCpp 包装器

powershell - 删除 PowerCLI 列表截断

macos - Firefox NPAPI 插件在 VMware 上的 OSX 中损坏

c - 使用 ksocket 导致内存泄漏

c - 使用memcpy方法

C++多线程Windows GUI(访问表单)

linux - FTDI 设备的 udev 规则在 VMware Ubuntu 16.04 中不起作用

c - 如何添加两个相同大小的二进制数组?

c - 嵌入式系统编程与设备驱动程序

java - JavaFX:基于属性的实体与基于属性的包装器