我正在“编程TCP套接字”,并且有一些基本问题。
当我为TCP客户端指定IP地址和端口时,我知道IP地址属于网络接口,而不是实际的整体计算机,并且该计算机具有多个网络接口,包括面向内的本地主机回送接口。
指定给TCP客户端的端口是否属于指定的接口?例如,是否可以在两个不同的接口上有两个相同编号的端口?像接口A的端口5000和接口的端口5000回送一样?
我问这个问题是因为我试图创建一个TCP客户端,该客户端将通过套接字连接到在Android虚拟设备上运行的TCP服务器。 TCP客户端在计算机A上运行,而android仿真器在计算机B上运行。
我已经查看了Android模拟器的端口转发,并了解到该模拟器在虚拟路由器后面运行,并且我必须配置端口转发,以便可以将TCP套接字连接从一个端口路由到另一个端口,但是仅这些文档有关于如何从回送接口(所谓的本地主机)进行端口转发的说明,因此很明显,如果我尝试创建一个不是回送接口的接口的套接字,则无法获得TCP套接字转发到仿真器,我的TCP连接失败。
所以我想知道回送接口上的端口5000在面向外的网络接口上是否有堂兄端口5000?
我想知道是否可以在较低的级别上将端口从面向外的接口端口5000转发到环回接口端口5000,然后环回接口端口5000将转发给位于其上的仿真器端口。
这可能吗?
答案 0 :(得分:1)
您可以使用端口转发软件
例如: 在Windows上
stcppipe.exe localhost port port
在Mac上
ipfw add fwd localhost,port tcp from any to any port via en0
在Linux上
iptables -t nat -A PREROUTING -p tcp -m tcp --dport21521 -j DNAT --to-destination192.168.0.211:1521
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -d 192.168.0.211 -p tcp -m tcp --dport 1521 -j SNAT --to-source 192.168.0.132
答案 1 :(得分:0)
adb -s emulator-5554 forward tcp:5000 tcp:6000
echo "1" > /proc/sys/net/ipv4/ip_forward
sudo sysctl -w net.ipv4.conf.enp0s31f6.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp --dport 5001 -j DNAT --to 127.0.0.1:5000
sudo iptables -A FORWARD -p tcp -d 127.0.0.1 --dport 5000 -j ACCEPT