python - 如何通过虚拟机连接到主机上的套接字服务器?
问题描述
我做了端口转发:我将服务器放在虚拟机上,并将客户端从主机连接到虚拟机。效果很好。
但是现在,当我试图在相反的方向这样做时,它没有。
我做的第一件事是使用以下参数进行端口转发:
- 主机端口:35001
- 转发端口:35001
- 虚拟机ip:192.168.40.130
它成功地完成了。
之后,当我这样做时(服务器脚本但在主机上的 cmd(shell)上):
s = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
s.bind(("0.0.0.0",35001))
我收到此错误:
Only one usage of each socket address (protocol/network address/port) is normally permitted
我相信那是因为有一个进程在监听 35001 端口。
在我转发端口之后(我使用 netstat 发现),它是 VMware(NAT)在 35001 上监听。
那么如何在宿主机上建立一个服务器,让它监听35001端口,并能够从虚拟机连接到它呢?
它是 windows 10 pro、python3、windows 7 VM。防火墙被禁用。我不想使用桥接连接。
解决方案
vmware 端口转发只是一个进程,由 vmware 服务创建,具有以下参数:
- 它在您的主机上运行
- 分配 TCP 端口 35001
- 监听传入的 TCP 连接
- 将它们转发到您的客户机 IP 的 TCP 35001
这就是它所做的,仅此而已。
当您开始端口转发时,此过程已启动并在您的主机上分配了 35001 TCP 端口。
这就是为什么您在主机上的 python 脚本不起作用的原因。它无法再次分配您主机的 35001 TCP 端口。
VMware 创建一个虚拟网络。您的虚拟机会看到此虚拟网络。没有以太网卡属于它,但它看起来好像会。它的 IP 地址范围为 192.168.40.0-192.168.40.255。您的主机也位于此虚拟网络上,IP 可能为 192.168.40.1。您的访客机器将其视为路由器。
这适用于仅主机、桥接或 NAT 虚拟网络类型。虚拟网络类型仅影响您的主机对数据包所做的操作以在虚拟网络和物理网络之间转发它们。
要在您的主机上运行服务器,您可以从您的客人连接,您不需要任何端口转发。只需停止它,您的 python 脚本就会运行。然后,从您的 guest 连接 192.168.40.1:35001。
推荐阅读
- r - how to calculate the number of a rating in a data frame
- python-3.x - how to retrieve data from SQL by entry.get() variable
- javascript - 变量的选定选项属性
- django - Django中的Pgsql重叠函数
- python - builtin function or method object is not iterable
- php - 时区偏移 PHP
- python-3.x - 在 python 中使用包
- javascript - 如何为 javascript 数组树创建搜索系统
- c# - 如何在 Spire.XLS 中克隆工作簿?
- r - 在 R 中使用 svmRadial 预测 caretStack 时,“newdata 中缺少训练数据中的变量”