Как открыть порт <1024 на рутованном устройстве Android? - PullRequest
1 голос
/ 14 июня 2011

Я пытаюсь открыть порт 123 на root Tab под управлением 2.3.3. Приложение запускается с правами суперпользователя и имеет доступ к Интернету. Но я получаю следующее исключение:

E/xxxxxxxxxxxxxxxxxxxxxxxxx.AndroidServerActivity( 4809): Unable to startup the NTP Server..., java.net.BindException: Permission denied
W/System.err( 4809): java.net.BindException: Permission denied
W/System.err( 4809):    at org.apache.harmony.luni.platform.OSNetworkSystem.bind(Native Method)
W/System.err( 4809):    at dalvik.system.BlockGuard$WrappedNetworkSystem.bind(BlockGuard.java:268)
W/System.err( 4809):    at org.apache.harmony.luni.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:81)
W/System.err( 4809):    at java.net.DatagramSocket.createSocket(DatagramSocket.java:193)
W/System.err( 4809):    at java.net.DatagramSocket.<init>(DatagramSocket.java:77)
W/System.err( 4809):    at net.sf.atomicdate.NTPClient.<init>(NTPClient.java:79)
W/System.err( 4809):    at net.sf.atomicdate.NTPClient.<init>(NTPClient.java:66)
W/System.err( 4809):    at xxxxxxxxxxxxxxxxxxxxxxxxxActivity.onCreate(AndroidServerActivity.java:141)
W/System.err( 4809):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
W/System.err( 4809):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
W/System.err( 4809):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
W/System.err( 4809):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
W/System.err( 4809):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
W/System.err( 4809):    at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err( 4809):    at android.os.Looper.loop(Looper.java:123)
W/System.err( 4809):    at android.app.ActivityThread.main(ActivityThread.java:3687)
W/System.err( 4809):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err( 4809):    at java.lang.reflect.Method.invoke(Method.java:507)
W/System.err( 4809):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
W/System.err( 4809):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
W/System.err( 4809):    at dalvik.system.NativeStart.main(Native Method)

Я провел некоторые поиски и не могу найти правильный способ сделать это. У кого-нибудь есть советы или примеры?

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

Я полагаю, что ваше предположение о том, что приложение "запускается с правами суперпользователя", неверно.Само приложение работает внутри виртуальной машины Dalvik, что означает, что оно не может обладать правами суперпользователя.Независимо от того, какое приложение вы запускаете с помощью команды "su", может иметь права root и, следовательно, может открывать порты <1024.Но само приложение Android <em>не может .См. AOSP , выпуск 4039 , для обсуждения данного вопроса и предоставления своего голоса за виртуальную машину Dalvik для получения этой поддержки.

Если все, что вам нужно, это запустить NTP-сервер, вы можетелучше запакуйте ntpd в ваше приложение и запустите его через su.В качестве альтернативы, вы можете попробовать запустить свой NTP-сервер Java на нестандартном порту и использовать утилиту командной строки (например, netcat) для «прокси» защищенного порта 123 на ваш нестандартный (> = 1024) порт.Что-то вроде: nc -l -u localhost 123 | nc -u localhost 1123 ( Википедия )

1 голос
/ 16 июня 2011

Как оказалось, ntpd действительно доступен на устройстве. Поэтому для моих целей я просто запустил собственный сервер ntpd:

ntpd -l 123

И это сработало так, как мне было нужно. Мне придется поэкспериментировать с некорневыми устройствами и поработать над методом перенаправления выше, чтобы сделать то же самое.

...