Android通过端口5060发送SIP数据包

时间:2012-10-03 09:32:53

标签: android sip socketexception

我在使用设备而不是仿真器通过UDP将SIP数据包发送到端口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()事件中调用。由包含SIP注册数据包的String sentence组成的数据包不通过端口5060发送。如果我修改端口,则数据包发送成功,即使我修改了字符串句子的内容。但是,如果我通过端口5060发送SIP注册数据包,则会发生SocketException。我不知道可能是什么问题,或者如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

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