在有根的Android设备上,如何打开端口< 1024?

时间:2011-06-14 01:03:20

标签: android root

我正在尝试在运行2.3.3的有根Galaxy Tab上打开端口123。该应用程序以超级用户权限启动并具有INTERNET权限。但是,我得到以下例外:

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 个答案:

答案 0 :(得分:3)

我相信你认为应用程序“以超级用户身份启动”的假设是有缺陷的。应用程序本身在Dalvik VM中运行,这意味着它不能拥有超级用户权限。无论您使用“su”命令启动什么应用程序,都可以拥有root权限,因此可以打开端口&lt; 1024。但Android应用程序本身不能。有关此事的讨论,请参阅AOSP issue 4039,并为Dalvik VM投票以获得此支持。

如果您只想启动NTP服务器,最好不要将ntpd打包到您的应用程序中,并通过su启动它。或者,您可以尝试在非标准端口上启动Java NTP服务器,并使用命令行实用程序(例如,netcat)将受保护端口123“代理”到非标准(&gt; = 1024)端口。 。例如:nc -l -u localhost 123 | nc -u localhost 1123Wikipedia

答案 1 :(得分:1)

事实证明,ntpd实际上可以在设备上使用。所以为了我的目的,我刚刚启动了原生的ntpd服务器:

ntpd -l 123

它也起作用,因为我也需要它。我将不得不尝试使用非root设备并使用上面的重定向方法来执行相同的操作。