因工作需要,必须要打开小于1024端口号的Socket,请教大家如何实现,多谢各位!
程序中已添加获取最高权限的代码:
try
{
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(command + "\n");
os.writeBytes("exit\n");
os.flush();
process.waitFor();
} catch (Exception e)
{
Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
return false;
} finally
{
try
{
if (os != null)
{
os.close();
}
process.destroy();
} catch (Exception e)
{
}
}
但程序仍然报错 java.net.BindException:Permission denied
Android底层使用Linux实现,linux中规定,0-1024称之为特权端口,只有root用户才能够绑定,如果要绑定这个范围的端口号,可以有两种选择:
切换到root用户运行该程序(简单,但有风险)
改变程序的属主为root,然后添加用户设置位(set-user-bit),程序中绑定端口之后,马上使用seteuid()类似的函数改变有效身份为普通用户。
chown -R root:root app
chmod 4755 app
在程序中bind完毕,马上调用seteuid()切换到普通用户,但是seteuid是C函数,java的我就不清楚了。
能否提供些具体的方案,在Android中如何实现?
打开小于1024端口的Socket代码如下:
Socket socket=new Socket("ip",1000); 注: ip为真实IP地址,端口为1000。
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
Server端Listen某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。
一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
创建Socket;
打开连接到Socket的输入/出流;
按照一定的协议对Socket进行读/写操作;
关闭Socket;