我的计算机上有一个 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 字节的有效负载。
我的接收器代码是否存在严重问题,或者这完全是另一个问题?