是否可以在Android上同时在多个网络接口上拥有活动的开放套接字?我想同时在wifi和移动数据网络上发送/接收数据报(显然在不同的套接字上)。从理论上讲,没有什么可以阻止这一点,IP允许多宿主主机,从我看到的至少有一个应用程序证明这在Android上的实践是可行的:http://speedify.com/
使用ConnectivityManager.getAllNetworks()
枚举所有网络,然后使用Network.bindSocket()
将我的套接字绑定到我需要的特定网络。不幸的是ConnectivityManager.getAllNetworks()
只返回一个带有一个条目的数组。如果wifi是活动的,则该条目对应于wifi网络,如果wifi不活动,则该条目对应于移动数据网络。看起来这个功能已被破坏,只是与ConnectivityManager.getActiveNetwork()
完全相同。
使用ConnectivityManager.getAllNetworkInfo()
枚举所有网络信息。这正确地返回NetworkInfo
的数组,其中包括wifi和移动数据。很遗憾,我无法找到从NetworkInfo
转到Network
的方法,以便我可以致电Network.bindSocket()
。只能从Network
到NetworkInfo
进行反向映射,这是没有用的。该文档还说API级别23中已弃用getAllNetworkInfo()
,建议使用getAllNetworks()
代替,但遗憾的是,这不是一个合适的替代品(请参阅第1步尝试解释)。
使用NetworkInterface.getNetworkInterfaces()
枚举所有接口,然后枚举本地IP地址,以便我可以使用InetAddress
,创建InetSocketAddress
并呼叫DatagramSocket.bind()
。同样问题是枚举只返回1个IPv4地址。根据wifi是否处于活动状态,我可以获取我的wifi IPv4地址或移动数据IPv4地址,但不能同时获取两者。
我被困住了,不知道还有什么可以尝试。我确信这一定是可能的,因为Speedify显然会这样做,但我找不到办法。
目的是访问只能通过其中一个网络访问的服务器,而不是另一个网络,我的任务确实需要主动同时连接,所以像“不要这样做”这样的建议实际上无济于事。
我不是在询问multipath TCP。我只需要host multihoming这是一个更简单的用例,允许在不同的网络接口上有几个不同的TCP连接(或UDP数据报),但每个连接只能通过一个网络接口严格工作。