【问题标题】:Android multicast high packet lossAndroid组播高丢包
【发布时间】:2015-05-16 09:18:27
【问题描述】:

我正在尝试在 android 中进行多播。我有三部手机(都是 Galaxy S5)。一部手机已打开 Wifi 网络共享并充当 AP(移动数据已关闭)。在其他两部电话中,一部正在发送到多播地址,另一部正在接收,两者都连接到第一部电话的 AP。发射和接收电话并排放置。 我发现在我发送的 1000 个数据包中,我只收到了大约 200 个。下面是我发送方式的概述

MulticastSocket mMulticastSocket = new MulticastSocket(port);
InetAddress multicastGrp = InetAddress.getByName("239.255.255.250");
mMulticastSocket.joinGroup(multicastGrp);
String sendStr = "";
int packetSize = 1400;
for(int i = 0; i < packetSize; i++)
sendStr = sendStr+"a";

for(int i = 0; i < 1000; i++)
mMulticastSocket.send(new DatagramPacket(sendStr.getBytes(), sendStr.getBytes().length, mMulticastSocket, port);

接收类似于,

//acquire multicast lock
byte[] buffer = new buffer[2048];
DatagramPacket rPack = new DatagramPacket(buffer, buffer.length);
mMulticastSocket.setReceiveBufferSize(1024*64);
int recvCount = 0;
while(true) {
mMulticastSocket.receive(rPack);
recvCount++;
}
//release multicast lock

发送和接收都是在工作线程中完成的。我还发现,随着“packetSize”值的减小,接收到的数据包数量正在增加。我猜这是由于 CPU 负载或接收缓冲区造成的,但无论如何,我想多播 1400 字节大小的数据包并接收尽可能多的数据(我知道接收数据包的数量是两部手机之间通道的函数但我认为将它们并排放置几乎是可以拥有的最佳渠道)。此外,当我进行 UDP 单播时,我能够接收发送的 1000 个数据包中的大约 900 个。 我无法理解为什么接收到的数据包数量对于多播来说如此之低。我错过了什么?

【问题讨论】:

标签: android udp multicast


【解决方案1】:

您的服务器正在尽可能快地发送数据包。您的发送者循环中没有任何东西会限制正在发送的数据包的数据速率。因此,每个数据包的发送时间间隔为微秒。网络堆栈中的某些东西很可能会导致一些缓冲区被填满。 UDP 没有内置的流量控制或拥塞控制。如果数据包之间可以有一些小的延迟(~1ms 到 5ms),您可能会看到更少的数据包丢失。

for (int i = 0; i < 1000; i++)
{
    mMulticastSocket.send(new DatagramPacket(sendStr.getBytes(), 
    sendStr.getBytes().length, mMulticastSocket
    Thread.sleep(5, 0);   // quick hack to throttle back rate
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多