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

时间:2013-04-23 11:54:36

标签: 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
  7. 请注意,我不会调用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的已删除输出(取决于我运行的主机脚本,它可能多达80次,然后它再次开始打印一个空列表。

    我会深入了解为什么会出现这个问题。

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

1 个答案:

答案 0 :(得分:0)

我已经找到了我的问题的答案,因为看起来没有人会回答它,我会为那些可能在将来遇到这个问题的人自己发布答案。

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

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

  1. VixHost_OpenVM
  2. VixVM_LoginInGuest
  3. VixVM_ListProcessesInGuest
  4. VixVM_LogoutFromGuest
  5. 因为每次运行listProcesses()时都使用与Vmware相同的句柄,只有当一个虚拟机尚不存在时,才会创建与虚拟机的TCP连接,并且我可以根据需要多次调用该函数

相关问题