在Java中接收UDP而不丢弃数据包

Noamik

我有一个需要改进的库,因为它正在丢弃许多数据包。我想接收一个RTP流,但该流传输器在一毫秒内发送30-40个数据包的突发(MJPEG流)。在Wireshark中监控流量时,我可以看到数据包完整。但是,当尝试使用Java接收它们时,我丢失了很多这些数据包。

我已经能够通过实现一个环形缓冲区来改善库的行为,该环形缓冲区在有数据包可用时会不断填充,并有一个单独的读取器线程从该缓冲区中读取数据。但是我仍然无法从我在Wireshark中看到的套接字中获取所有数据包。通过RTP序列号,我可以在读取器线程中监视所处理的数据包是否是预期的数据包。

以下代码正在处理数据包接收:

private volatile byte[][] packetBuffer = new byte[1500][BUFFER_SIZE];
private volatile DatagramPacket[] packets = new DatagramPacket[BUFFER_SIZE];
private volatile int writePointer = 0;

public void run() {
    Thread reader = new RTPReaderThread();
    reader.start();

    while (!rtpSession.endSession) {

        // Prepare a packet
        packetBuffer[writePointer] = new byte[1500];
        DatagramPacket packet = new DatagramPacket(packetBuffer[writePointer], packetBuffer[writePointer].length);

        // Wait for it to arrive
        if (!rtpSession.mcSession) {
            // Unicast
            try {
                rtpSession.rtpSock.receive(packet);
            } catch (IOException e) {
                if (!rtpSession.endSession) {
                    e.printStackTrace();
                } else {
                    continue;
                }
            }
        } else {
            // Multicast
            try {
                rtpSession.rtpMCSock.receive(packet);
            } catch (IOException e) {
                if (!rtpSession.endSession) {
                    e.printStackTrace();
                } else {
                    continue;
                }
            }
        }
        packets[writePointer] = packet;

        this.incrementWritePointer();           
        synchronized (reader) {
            reader.notify();
        }
    }
}

我已经知道的:

  • 我知道允许UDP丢失数据包,但我仍然想获得最佳结果。如果wireshark可以看到该数据包,那么我也希望能够尽可能地对其进行检索。
  • 我知道丢失数据包时环形缓冲区永远不会满,因此也不会丢失数据包。我尝试使用100甚至1000的BUFFER_SIZES,但是在总共发送1000个数据包之前,我已经丢失了第一个数据包。

所以问题是:从DatagramSocket接收尽可能多的数据包的最佳实践是什么?我可以改善对数据包突发的处理吗?

布雷特

尝试使用设置数据报套接字上的SO_RCVBUF大小rtpSock.setReceiveBufferSize(size)这仅是对OS的建议,OS可能无法兑现它,尤其是当它太大时。但我会尝试将其设置为(SIZE_OF_PACKET * 30 * 100),其中30是突发数据包的数量,而100是您无法跟上到达速度的毫秒数的猜测。

请注意,如果您的代码通常无法跟上到达速度的处理要求,则操作系统别无选择,只能丢弃数据包。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用proc命令跟踪UDP数据包丢弃

来自分类Dev

接收PHP中的UDP数据包数据报

来自分类Dev

为什么我无法在Python中接收UDP数据包?

来自分类Dev

在IPTable中记录丢弃的数据包?

来自分类Dev

无法在Python中接收UDP数据包

来自分类Dev

如何在Android上运行的Chrome应用中接收UDP广播数据包

来自分类Dev

无法通过广播地址接收UDP数据包,ArtNet

来自分类Dev

使用python(scapy?)从网络接收到的丢弃数据包

来自分类Dev

无法接收UDP数据包

来自分类Dev

在udp服务器中接收最新数据包-C

来自分类Dev

如何使用proc命令跟踪UDP数据包丢弃

来自分类Dev

在PHP中接收UDP数据包数据报

来自分类Dev

Java DatagramSocket不接收数据包

来自分类Dev

为什么我无法在Python中接收UDP数据包?

来自分类Dev

在IPTable中记录丢弃的数据包?

来自分类Dev

无法从微控制器接收UDP数据包

来自分类Dev

如何在Python中接收UDP数据包而不丢弃

来自分类Dev

如何检测网络是否丢弃UDP数据包?

来自分类Dev

无需端口转发即可接收UDP数据包

来自分类Dev

Wirehark无法接收到UDP数据包

来自分类Dev

Wireshark可以通过子网接收UDP广播数据包

来自分类Dev

Erlang Udp服务器丢弃大量数据包

来自分类Dev

如何打印在NS-3中使用UDP接收的数据包?

来自分类Dev

JAVA UDP服务器无法接收数据包

来自分类Dev

在Python的CrossbarServer中从Arduino接收UDP数据包

来自分类Dev

从多个广播服务器接收UDP数据包

来自分类Dev

通过广播接收Unity Android应用程序中的UDP数据包

来自分类Dev

UDP 数据包丢弃

来自分类Dev

Boost ASIO - 丢弃 UDP 数据包,与 UE4 udp 接收器相比损失显着

Related 相关文章

热门标签

归档