这是一个与编程相关的问题,但似乎更适合 SuperUser 而不是 StackOverflow。
我在 PC 上安装了 McAfee(LiveSafe 的试用版 - Internet Security)。我正在运行一个 Python 程序,该程序使用 CherryPy 在本地主机 (127.0.0.1) 上设置 Web 服务器。我在同一台机器上还有一个单独的程序,用于向 CherryPy 程序发送请求。
当 McAfee 防火墙开启时,此本地主机通信失败(参见下面的日志),而当其关闭时,此本地主机通信可以正常进行。
然而,当我将 CherryPy 服务器作为其自己的应用程序运行(例如,从 cmd 提示符启动它)时,即使防火墙打开,一切也能正常工作。但是,当我让我的主程序将 CherrPy/Python .exe 作为子进程启动时(这是我的应用程序的正常工作方式 - 主“浏览器”应用程序将 CherryPy 应用程序作为子进程启动),它确实不是工作。
总结一下:
- 我的应用程序需要将此 CherryPy 服务器作为子进程运行。
- 当 McAfee 防火墙处于活动状态时,它会阻止我的主应用程序和子进程之间的本地主机通信。
- 但是,当我将 CherryPy 和我的主应用程序分别作为它们自己的顶级应用程序运行时,一切都正常。
- 我尝试在 McAfee 控制面板中做出明显的更改,以允许我的程序名称(主应用程序和 CherryPy 服务器应用程序)以及它们用于通信的单个端口(56677)例外,但这没有帮助。
我阅读了 McAfee 社区博客,发现关于阻止或不阻止 localhost 的问题由来已久。然后我还看到了一些关于“进程欺骗”的内容。因此,我试图了解它为什么会阻止子进程,以及是否有办法 (a) 配置 McAfee 不这样做,同时仍保持防火墙开启,或者 (b) 以某种不同的方式启动我的进程,以防止这种子进程歧视(我使用 Win32 APICreateProcess()
来启动它 - 也许ShellExecuteEx()
会产生不同的结果?)。
下面是 CherryPy 日志,显示其无法启动。
[14/Aug/2015:19:45:39] ENGINE Bus STARTING
[14/Aug/2015:19:45:39] ENGINE Set handler for console events.
[14/Aug/2015:19:45:39] ENGINE Started monitor thread 'Autoreloader'.
[14/Aug/2015:19:45:39] ENGINE Started monitor thread '_TimeoutMonitor'.
[14/Aug/2015:19:47:20] ENGINE Error in 'start' listener <bound method Server.start of <cherrypy._cpserver.Server object at 0x02547250>>
Traceback (most recent call last):
File "cherrypy\process\wspbus.pyc", line 205, in publish
File "cherrypy\_cpserver.pyc", line 168, in start
File "cherrypy\process\servers.pyc", line 177, in start
File "cherrypy\process\servers.pyc", line 233, in wait
File "cherrypy\process\servers.pyc", line 459, in wait_for_occupied_port
IOError: Port 56677 not bound on '127.0.0.1'