Android下的socket怎么区分不同Network的
在Android下当使用 connectivityManager.bindProcessToNetwork(network)把app绑定到某个网络(或者使用Socket socket = new Socket(“xx.xx.xx.xx”,80); network.bindSocket(socket) 的方式绑定到该网络)后,该app的所有流量都会走该网络,这个是怎么实现的呢。
其实是android修改了java的实现,建立socket的时候,使用linux下防火墙的SO_MARK的方式,把该socket的所有流量和某个mark相关联,然后把该mark规则加入底层iptables,由数据收发的时候,iptables就能区分把数据分发到那个网络上了(比如wifi、蜂窝通信等不同的network在iptables上都设置有不同的mark值),也就是走了个策略路由。