Android模拟器如何从其他主机访问redir端口

5
在Android应用程序中运行一个服务器套接字,并使用模拟器进行调试。使用模拟器控制台和“redir add tcp:8888:8888”,我可以使服务对在开发计算机上运行的程序可用(作为localhost:8888)。但是,redir端口在任何其他网络接口上都不可用,这意味着我无法通过本地开发计算机或网络上的第二个计算机上的主机IP访问它。是否有人知道是否可能使模拟器绑定到所有网络接口,或者有其他技巧可以使网络上的其他主机连接到模拟器?谢谢。

发现了一个丑陋的解决方法,使用http://www.boutell.com/rinetd/,但是拥有两个额外的网络堆栈来进行缓冲和转发并不理想。 - Thingfish
3个回答

7
我发现使用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”将主机发送到端口5000的tcp数据转发到模拟器中的端口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" - "/usr/sbin/rinetd"

修改配置文件后重新初始化rinetd:

  • "cat /var/run/rinetd.pid" 显示rinetd的pid
  • "sudo kill -1 <pid>" 重新初始化它(例如,"sudo kill -1 3225")

1
谢谢,伙计。这对我来说真的很有帮助。 - Sathish

2

从技术上讲,模拟器将套接字绑定到本地回环上。您可以通过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作为目标地址。

您需要管理员权限,但可以按会话基础进行操作。


有人能解释一下如何做Dario上面说的吗?我在弄iptables命令时遇到了麻烦。
你唯一的解决方案是将物理接口的端口转发到本地环回。在Linux系统上,我理解你正在使用这个系统,最简单的方法是通过iptables使用任何源接口作为输入,127.0.0.1作为目标地址。
谢谢。(我想把这个作为他的答案的注释,但我不知道怎么做...)
- michaelmoo

1
你也可以使用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

作为一个例子,如果你想让其他计算机能够连接到Android模拟器的1234端口,你需要在主机计算机上有两个端口。
  • <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

我想从网络上的其他计算机连接到telnet,我使用了这个技巧。谢谢,非常干净。nc -l 5554 | nc 127.0.0.1 5554 -v - karianpour
当我尝试使用redir add时,出现了“KO:未知命令,请尝试'help'”的错误,无法正常工作。 - Dinesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接