是否可以同时在多个网络接口上使用活动的开放套接字?

时间:2017-12-03 16:53:49

标签: android sockets networking

问题

是否可以在Android上同时在多个网络接口上拥有活动的开放套接字?我想同时在wifi和移动数据网络上发送/接收数据报(显然在不同的套接字上)。从理论上讲,没有什么可以阻止这一点,IP允许多宿主主机,从我看到的至少有一个应用程序证明这在Android上的实践是可行的:http://speedify.com/

到目前为止我尝试过的事情

尝试1

使用ConnectivityManager.getAllNetworks()枚举所有网络,然后使用Network.bindSocket()将我的套接字绑定到我需要的特定网络。不幸的是ConnectivityManager.getAllNetworks()只返回一个带有一个条目的数组。如果wifi是活动的,则该条目对应于wifi网络,如果wifi不活动,则该条目对应于移动数据网络。看起来这个功能已被破坏,只是与ConnectivityManager.getActiveNetwork()完全相同。

尝试2

使用ConnectivityManager.getAllNetworkInfo()枚举所有网络信息。这正确地返回NetworkInfo的数组,其中包括wifi和移动数据。很遗憾,我无法找到从NetworkInfo转到Network的方法,以便我可以致电Network.bindSocket()。只能从NetworkNetworkInfo进行反向映射,这是没有用的。该文档还说API级别23中已弃用getAllNetworkInfo(),建议使用getAllNetworks()代替,但遗憾的是,这不是一个合适的替代品(请参阅第1步尝试解释)。

尝试3

使用NetworkInterface.getNetworkInterfaces()枚举所有接口,然后枚举本地IP地址,以便我可以使用InetAddress,创建InetSocketAddress并呼叫DatagramSocket.bind()。同样问题是枚举只返回1个IPv4地址。根据wifi是否处于活动状态,我可以获取我的wifi IPv4地址或移动数据IPv4地址,但不能同时获取两者。

我被困住了,不知道还有什么可以尝试。我确信这一定是可能的,因为Speedify显然会这样做,但我找不到办法。

为什么我需要这个

目的是访问只能通过其中一个网络访问的服务器,而不是另一个网络,我的任务确实需要主动同时连接,所以像“不要这样做”这样的建议实际上无济于事。

[更新]

我不是在询问multipath TCP。我只需要host multihoming这是一个更简单的用例,允许在不同的网络接口上有几个不同的TCP连接(或UDP数据报),但每个连接只能通过一个网络接口严格工作。

0 个答案:

没有答案