Stefan Steiger
Stefan Steiger

Reputation: 82136

Android never receives UDP packet

The below code results in a timeout.

It works fine on non-Android Java. What's the matter?

 //@Override
public static void run()
{
    //System.out.println ( "Local Machine IP : "+addrStr.toString (  )  ) ;
    HelloWorldActivity.tv.setText("Trace 1");

    try
    {
        // Retrieve the ServerName
        InetAddress serverAddr; //= InetAddress.getByName(Server.SERVERIP);
        InetAddress ias[] = InetAddress.getAllByName(Server.SERVERNAME);
        serverAddr  = ias[0];

        Log.d("UDP", "C: Connecting...");
        /* Create new UDP-Socket */
        DatagramSocket socket = new DatagramSocket();

        /* Prepare some data to be sent. */
        String strQuery="ÿÿÿÿgetservers"+" "+Server.iProtocol+" "+"'all'";
        Log.d("UDP", strQuery);
        //byte[] buf = ("ÿÿÿÿgetservers 68 'all'").getBytes();
        byte[] buf = strQuery.getBytes();

        /* Create UDP-packet with
         * data & destination(url+port) */
        DatagramPacket packet = new DatagramPacket(buf, buf.length,
                                                   serverAddr, Server.SERVERPORT);

        Log.d("UDP", "C: Sending: '" + new String(buf) + "'");

        /* Send out the packet */
        socket.setSoTimeout(5000);
        socket.send(packet);
        Log.d("UDP", "C: Sent.");
        Log.d("UDP", "C: Done.");

        // http://code.google.com/p/android/issues/detail?id=2917

        byte[] buffer= new byte[1024*100];
        DatagramPacket receivePacket
          = new DatagramPacket(buffer,
                               buffer.length); //, serverAddr, Server.SERVERPORT);
        socket.receive(receivePacket);
        HelloWorldActivity.tv.setText("TTT");

        String x = new String(receivePacket.getData());
        Log.d("UDP", "C: Received: '" + x  + "'");
        HelloWorldActivity.tv.setText(x);

   } catch (Exception e) {
       HelloWorldActivity.tv.setText(e.getMessage());
       Log.e("UDP", "C: Error", e);
   }
}


public class Server
{
    /*
    //public static java.lang.string SERVERIP;
    public static String SERVERNAME = "monster.idsoftware.com";
    public static String SERVERIP = "192.246.40.56";
    public static int SERVERPORT = 27950;
    public static int PROTOCOL = 68;
      */

    //public static String SERVERNAME="monster.idsoftware.com";
    public static String SERVERNAME="dpmaster.deathmask.net";

    public static String SERVERIP="192.246.40.56";
    public static int SERVERPORT=27950;
    //public static int iProtocol= 68; // Quake3
    public static int iProtocol=71; // OpenArena

}

Android manifest:

<?xml version="1.0" encoding="utf-8"?>

<use-permission id="android.permission.READ_CONTACTS" />

    <use-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_GPS" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
    <uses-permission android:name="android.permission.ACCESS_CELL_ID" />

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

<application
        android:icon="@drawable/icon"
        android:label="AAA New Application"
        >
    <activity android:name="HelloWorldActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>

Upvotes: 5

Views: 20321

Answers (4)

David Webb
David Webb

Reputation: 193696

Are you testing this on the emulator or on an actual phone? If you're using an emulator you need to be aware of how networking on the emulator works. Most specifically:

Each instance of the emulator runs behind a virtual router/firewall service that isolates it from your development machine's network interfaces and settings and from the internet. An emulated device can not see your development machine or other emulator instances on the network. Instead, it sees only that it is connected through Ethernet to a router/firewall.

You'll probably need to set up port forwarding, either using the Emulator console or using the adb command.

Upvotes: 7

optics
optics

Reputation: 11

byte[] buf = new byte[256];
socket = new DatagramSocket(port);
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);

Above worked for me... Your buffer seems large?


Might be a little far fetched but what are you trying to receive from?

If you are trying to communicate with a XP machine that has two network cards (one could be wired and the other wireless, any mix) and you are are using XP built in firewall?

Then UDP requests are only listened for on the first network on the computer, disable other network cards on your system, only have enabled the one that your trying to talk your Android device to.

Upvotes: 1

Hunter D
Hunter D

Reputation: 673

To send/broadcast UDP using socket.send(), you need the android permission:

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

However, even so, socket.receive() doesn't seem to catch the broadcast, even when run in the same context. I wonder if there's another permission for socket.receive()?...

Upvotes: 1

Elliott Hughes
Elliott Hughes

Reputation: 4665

UDP works fine. i don't think your server is sending a response because your outgoing packet doesn't contain the bytes you think it contains.

see my comments in the android bug you raised (http://code.google.com/p/android/issues/detail?id=6163).

Upvotes: 2

Related Questions