Эмулятор Android получает доступ к порту переадресации с другого хоста - PullRequest
2 голосов
/ 27 октября 2010

В приложении для Android работает сервер-сокет, который я отлаживаю с помощью эмулятора.Используя консоль эмуляторов и команду «redir add tcp: 8888: 8888», я могу сделать службу доступной для программы, работающей на моем компьютере разработчика (как localhost: 8888).

Однако порт redir недоступен ни на одномдругой сетевой интерфейс, то есть я не могу получить к нему доступ через host-ip ни на локальной машине разработки, ни на вторичной машине в сети.Кто-нибудь знает, можно ли привязать эмулятор ко всем сетевым интерфейсам, или есть какой-то другой прием, позволяющий другим хостам в сети подключаться к эмулятору?

Спасибо

Ответы [ 3 ]

6 голосов
/ 01 февраля 2011

Мне показалось, что комментарий / предложение ОП по использованию rinetd намного проще, чем iptables.

rinetd может перехватывать соединения на одном интерфейсе и пересылать их на другой IP; поэтому, чтобы решить эту проблему, связанную с тем, что эмулятор недоступен для компьютеров, кроме хост-компьютера, вы перехватываете входящие соединения с вашим хостом и перенаправляете их на 127.0.0.1

Вот как:

Сначала установите rinetd (http://www.boutell.com/rinetd/)

  • Linux: либо загрузите его по ссылке выше, либо в терминале в Ubuntu введите "sudo apt-get install rinetd". Команда может отличаться в других дистрибутивах Linux ...
  • Windows: скачать по ссылке выше (но там написано только 95/98 / NT ..)

Далее настройте перенаправление портов в эмуляторе:

  • запустите AVD
  • в терминале введите "telnet localhost 5554" (или любой другой порт для вашего avd)
  • после подключения по telnet введите «redir add <protocol>:<host port>:<emu port>» (например, «redir add tcp:5000:7000» для пересылки данных tcp, отправленных на порт 5000 хоста, на порт 7000 в эмуляторе)

Настроить rinetd:

  • Отредактируйте файл /etc/rinetd.conf и добавьте строку "<host ip> <host port> 127.0.0.1 <localhost port>". Поэтому, если IP-адрес вашего хост-компьютера равен 123.45.67.89, и вы хотите использовать порт 5000, а затем перенаправить его на 127.0.0.1:5000, "123.45.67.89 5000 127.0.0.1 5000"

Я не уверен, что rinetd запускается автоматически после его установки .. чтобы запустить его:

  • "/usr/sbin/rinetd"

Чтобы повторно инициализировать rinetd после изменения файла конфигурации:

  • "cat /var/run/rinetd.pid" показывает pid rinetd
  • "sudo kill -1 <pid>" повторно инициализирует его (например, "sudo kill -1 3225")
2 голосов
/ 27 октября 2010

Технически, эмулятор ограничивает сокет локальной петли.Это можно увидеть из команды netstat

$ netstat -an | more
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
...
tcp4       0      0  127.0.0.1.8888         *.*                    LISTEN
...

«Локальный адрес» должен быть * .8888, чтобы ваша служба была доступна извне.

Единственное решение, которое у вас есть, - этоперенаправить порт из физического интерфейса в локальный цикл.

В linux - системе, которую, как я понимаю, вы используете, проще всего это сделать с помощью iptables, использующего любой исходный интерфейс в качестве входных данных, и 127.0.0.1 в качестве адреса назначения.

Вам потребуются права администратора, но это можно сделать для каждого сеанса.

0 голосов
/ 07 января 2014

Вы также можете использовать netcat для переадресации портов.

Запустите эмулятор, затем запустите на терминале следующее:

telnet localhost 5554
redir add tcp:<host port>:<emu port>
quit

Настройка переадресации портов:

nc -l -p <external port> -c "nc 127.0.0.1 <host port> -v" -v

Если переключатель -c недоступен, вместо него можно использовать следующее:

nc -l <external port> | nc 127.0.0.1 <host port> -v

Например, если вы хотите, чтобы другие компьютеры могли подключаться к порту 1234 вашего эмулятора Android, выпотребуется 2 порта на вашем хост-компьютере.

  • <host port>: порт, который прослушивает локальный интерфейс, затем пересылает сообщения на порт 1234. Мы будем использовать 9200.
  • <external port>: порт, который прослушивает любой интерфейс, затем переадресуетсообщения на <host port>.Мы будем использовать 9100.

Команды:

redir add tcp:9200:1234
nc -l -p 9100 -c "nc 127.0.0.1 9200 -v" -v
...