使用设备而不是仿真器将设备通过UDP发送到端口5060时,我遇到了Android上的问题。唯一的例外是:Android通过端口5060发送SIP数据包
java.net.SocketException: sendto failed: EPERM(Opereation not permitted)
在某些设备,如Galaxy Nexus的相同的代码工作的机器人上的其它设备如华硕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()事件。由包含SIP注册数据包的String sentence
组成的数据包不通过端口5060发送。如果我修改端口,数据包将成功发送,即使我修改了字符串语句的内容。但是,如果我通过端口5060发送SIP注册数据包,则发生SocketException
。我不知道可能是什么问题或如何解决这个问题。
任何可能妨碍您的防火墙或安全软件? – plmaheu
您是否在真实的设备中使用了上述IP地址?除非您连接到专用C类网络,否则此IP将不可用。很可能您的设备网络地址是以192.168开头的B类设备...... – Luis
该设备位于C类网络中。我会调查是否有任何安全措施,但不应有任何问题。 – frans1989