רשתות למשחקים מרובי משתתפים

ברוב המקרים, פרוטוקולי גילוי הרשת של 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 המקומית.