使用设备而不是模拟器将 SIP 数据包通过 UDP 发送到端口 5060 时,我在 Android 上遇到问题。例外是:
java.net.SocketException: sendto failed: EPERM(Opereation not permitted)
在某些设备(例如 Galaxy Nexus)上,相同的代码可以在其他设备(例如 Asus Transformer TF101 和 Galaxy Tab 2)上运行,我遇到了这些问题。我有所需的权限android.permission.INTERNET
。当通过另一个端口(比如 9876)发送相同的 SIP 数据包时,数据包发送成功。即使通过端口 5060(不是 SIP 数据包)发送其他内容,数据包仍然可以成功发送。在某些设备上似乎不允许通过端口 5060 组合 SIP 数据包。我创建了一个测试程序来复制这个问题:
try
{
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("10.111.110.6");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = "Register sip ...";
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, IPAddress, 5060);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
clientSocket.receive(receivePacket);
int x = receivePacket.getLength();
String modifiedSentence = new String(receivePacket.getData(), 0, x);
ds_tv.setText("FROM SERVER:" + modifiedSentence + " Length: "+ x);
clientSocket.close();
}
catch (Exception e)
{
Log.e("Test", e.getMessage());
ds_tv.setText(e.getMessage());
}
这个测试程序只包含一个按钮,上面的代码在它的 onClick() 事件中被调用。包含String sentence
SIP 注册数据包的数据包不会通过端口 5060 发送。如果我修改端口,则数据包发送成功,即使我修改了字符串语句的内容。但是,如果我通过端口 5060 发送 SIP 注册数据包,SocketException
则会发生。我不知道可能是什么问题或如何解决这样的问题。