Как подключиться к серверу сокетов на хост-машине через виртуальную машину?

#python #sockets #virtual-machine #port #portforwarding

#python #сокеты #виртуальная машина #порт #замена портов

Вопрос:

Я сделал переадресацию портов: я поместил сервер на виртуальную машину и подключил клиента с хоста к виртуальной машине. Это сработало хорошо.

Но теперь, когда я попытался сделать это в обратном направлении, этого не произошло.

Первое, что я сделал, это перенаправление портов со следующими параметрами:

  • порт хоста: 35001
  • порт для пересылки: 35001
  • ip виртуальной машины: 192.168.40.130

Это было сделано успешно.

После этого, когда я сделал это (сценарий сервера, но в cmd (оболочке) на хосте):

 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 прослушивается процесс.

Это VMware (NAT), прослушивающий 35001, после того, как я перенаправил порт (я обнаружил это с помощью netstat).

Итак, как создать сервер на хосте, заставить его прослушивать порт 35001 и иметь возможность подключаться к нему с виртуальной машины?

Это Windows 10 pro, python3, виртуальная машина Windows 7. Брандмауэры отключены. Я не хочу использовать мостовое соединение.

Ответ №1:

Поддержка портов Vmware — это просто процесс, созданный службой vmware, со следующими параметрами:

  • он запускается на вашем хост-компьютере
  • выделяет TCP-порт 35001
  • прослушивает входящие TCP-соединения
  • перенаправляет их на TCP 35001 IP-адреса вашей гостевой машины

Это то, что делает is, и не более.

Когда вы запустили переадресацию портов, этот процесс был запущен и выделил TCP-порт 35001 на вашем хосте.

Вот почему ваш скрипт python на хосте не работал. Не удалось снова выделить TCP-порт 35001 вашего хоста.

VMware создает виртуальную сеть. Ваши виртуальные машины видят эту виртуальную сеть. Ему не принадлежит карта Ethernet, но похоже, что это так. Он имеет диапазон IP-адресов 192.168.40.0-192.168.40.255. Также ваш хост-компьютер находится в этой виртуальной сети, вероятно, с IP 192.168.40.1. Ваша гостевая машина видит его как маршрутизатор.

Это относится к типам виртуальных сетей только для хоста, мостовых или NATted. Типы виртуальных сетей влияют только на то, что ваша хост-машина делает с пакетами для их пересылки между виртуальной и вашей физической сетью.

Для запуска сервера на вашем хосте, который вы можете подключить с вашего гостевого, вам не нужна переадресация портов. Просто остановите его, чтобы ваш скрипт python запустился. Затем подключите 192.168.40.1: 35001 от вашего гостя.