2

エミュレータの代わりにデバイスを使用してUDP経由でポート5060にSIPパケットを送信すると、Androidで問題が発生します。例外は次のとおりです。

java.net.SocketException: sendto failed: EPERM(Opereation not permitted)

Galaxy Nexusなどの一部のデバイスでは、同じコードがAsusTransformerTF101やGalaxyTab2などの他のデバイスで動作します。これらの問題が発生しています。必要な許可がありandroid.permission.INTERNETます。同じSIPパケットを別のポート(たとえば9876)に送信すると、パケットは正常に送信されます。ポート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());
}

このテストプログラムはボタン1つだけで構成されており、上記のコードはonClick()イベントで呼び出されます。SIP登録パケットを含むで構成されるString sentenceパケットはポート5060を介して送信されません。ポートを変更すると、文字列文の内容を変更しても、パケットは正常に送信されます。ただし、ポート5060を介してSIP登録パケットを送信するとSocketException発生します。何が問題なのか、どうすればそのような問題を解決できるのかわかりません。

4

1 に答える 1

1

問題は解決され、エラーはSIPパケットのペイロードが原因で発生していました。SIPパケットのCSeq値は、最初は0に設定されていました。代わりに、1から開始する必要がありました。

于 2012-10-19T12:35:51.513 に答える