2012-10-03 107 views
1

使用设备而不是仿真器将设备通过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。我不知道可能是什么问题或如何解决这个问题。

+0

任何可能妨碍您的防火墙或安全软件? – plmaheu

+0

您是否在真实的设备中使用了上述IP地址?除非您连接到专用C类网​​络,否则此IP将不可用。很可能您的设备网络地址是以192.168开头的B类设备...... – Luis

+0

该设备位于C类网络中。我会调查是否有任何安全措施,但不应有任何问题。 – frans1989

回答

1

问题已解决,并且错误是由SIP数据包的有效负载引起的。 SIP数据包中的CSeq值最初被设置为0。相反,它必须从1开始。