3

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

我已经验证了发射器可以与 Wireshark 一起使用。我在同一个网络上设置了四个 802.11 接收器(2 部安卓手机和 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 字节的有效负载。

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

4

0 回答 0