为什么我的android接收器丢弃10-60%的UDP广播包?

时间:2013-08-12 18:35:12

标签: android udp

我的计算机上有一个802.3有线发送器应用程序,我写的是每隔10ms广播UDP数据包。每个广播数据包都包含一个4字节整数值,该值对于其特定数据包是唯一的,这使我能够在接收器端确切地确定丢弃了多少数据包。

我已经确认变送器可以与Wireshark配合使用。我在同一个网络上设置了四个802.11接收器(2个Android手机和2个笔记本电脑)。笔记本电脑接收了95%的UDP广播包;一部手机收到89%;另一部手机收到了40%。

为什么呢?

这是我的Android接收器代码的一部分:

public class NetThread extends Thread {

    int[] pkt_nums; 
    int p; 

    NetThread(int[] pkt_nums)
    {
        this.pkt_nums = pkt_nums; 
        for (int i=0; i<pkt_nums.length; i++)
        {
            pkt_nums[i]=0; 
        }
        p = 0; 
    }

    @Override
    public void run() 
    {
        receiveData(); 
    }

    public void receiveData()
    {
        // request permission to do network operations in manifest file...done

        // start the network side of things
        DatagramSocket sock = null; 
        DatagramPacket pkt = null; 

        try 
        {
            byte[] data = new byte[C.PAYLOAD_MAX]; 
            sock = new DatagramSocket(C.NET_PORT); 
            sock.setSoTimeout(C.NET_SO_TIMEOUT);
            pkt = new DatagramPacket(data, 0, C.PAYLOAD_MAX); 

            while (true)
            {
                Thread.sleep(0); // allow for an interrupt
                try 
                {
                    sock.receive(pkt); 
                    int length = pkt.getLength(); 
                    boolean success = writeToBuffer(pkt.getData(), length); 
                    if (!success) break; 
                }
                catch (InterruptedIOException e)
                {
                    // thrown when a timeout occurs
                    Log.d(C.DTAG, "net: no packets yet"); 
                }
            }
            Log.d(C.DTAG, "buffer is full. done receiving."); 
            if (sock != null) sock.close(); 
        } 
        catch (InterruptedException x) 
        {
            Log.d(C.DTAG, "net: was interrupted."); 
        } 
        catch (SocketException e) 
        {
            Log.d(C.DTAG, "net: SocketException"); 
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            Log.d(C.DTAG, "net: IOException"); 
            e.printStackTrace();
        }
        if (sock != null) sock.close(); 
    }

    public boolean writeToBuffer(byte[] data, int length)
    {
        // each packet should have exactly 4 bytes - a number
        int pkt_num = data[0] & 0x000000FF | data[1]<<8 & 0x0000FF00 | data[2]<<16 & 0x00FF0000 | data[3]<<24 & 0xFF000000; 

        if (p < pkt_nums.length) 
        {
            pkt_nums[p++] = pkt_num; 
            return true; // success
        }
        else
        {
            return false;
        }
    }

}

我在主要活动中声明上述课程如下:

mNetThrd = new NetThread(pkt_nums); 
mNetThrd.setDaemon(true); 
mNetThrd.start(); 

我现在会尝试提升线程优先级,但我有一种感觉我做错了。我需要为我的应用程序获得至少95%的UDP广播数据包。

更多细节:笔记本电脑和手机彼此相邻,距离路由器30英尺,具有视线可见度。笔记本电脑1收到了95%的数据包。笔记本电脑2获得94%。电话1收到89%。电话2收到40%。两者都运行相同的应用程序其他网络流量很小。 Android中丢弃的数据包通常一次发生在20-50个组中。 802.11有一个干净的通道。每个数据包包含一个4字节的有效负载。

我的接收器代码是否存在严重错误,或者这是另一个问题吗?

0 个答案:

没有答案