Многопользовательская сетевая игра

Для многих задач многопользовательской сетевой игры протоколы обнаружения сети Android должны обеспечить все необходимое и работать должным образом. ChromeOS также имеет встроенную пересылку широковещательных пакетов в обоих направлениях, чтобы гарантировать, что ваша игра будет корректно получать ответы на широковещательные пакеты, отправленные другим участникам локальной сети, а также получать широковещательные пакеты, отправленные другими участниками локальной сети.

В силу архитектуры ChromeOS и правил безопасности, Android-приложению, которому необходимо знать IPv4-адрес устройства ChromeOS, на котором оно работает, например, для передачи этого адреса серверу, который хочет выступать посредником в многопользовательской игре между клиентами, не использующими ChromeOS, находящимися в той же локальной сети, потребуется реализовать дополнительную логику.

Чтобы получить IPv4-адрес, назначенный сети с наивысшим приоритетом, к которой подключено устройство ChromeOS, проверьте системное свойство Android vendor.arc.net.ipv4.host_address и, при необходимости, vendor.arc.net.ipv4.host_gateway . Один из способов сделать это:

fun getChromeOsIpAddress() : String {
   val process = ProcessBuilder().command("/system/bin/getprop", "vendor.arc.net.ipv4.host_address").start()
   val ipAddress = readInput(process.inputStream)
   return ipAddress
}

fun getChromeOsIpGateway() : String {
   val process = ProcessBuilder().command("/system/bin/getprop", "vendor.arc.net.ipv4.host_gateway").start()
   val gatewayAddress = readInput(process.inputStream)
   return gatewayAddress
}

fun readInput(inputStream: InputStream) : String {
   val bufferedReader = BufferedReader(InputStreamReader(inputStream))
   val stringBuilder = StringBuilder()

   var line: String? = null
   while (bufferedReader.readLine().also({ line = it}) != null) {
       stringBuilder.append(line).append('\n')
   }

   return stringBuilder.toString()
}

Трафик, отправляемый на этот IPv4-адрес в локальной сети, будет перенаправлен в приложение Android без необходимости дополнительной пробивки NAT. Для получения дополнительной информации об этом обходном решении для IPv4 см. эту проблему в Chromium .

В сетях IPv6 Android получает собственный сетевой адрес, отдельный от ChromeOS, и ожидается, что прямые соединения в локальной сети IPv6 с этим адресом будут работать так, как если бы Android был напрямую подключен к локальной сети IPv6.