当前位置:网站首页>UDP传输rtp数据包丢帧
UDP传输rtp数据包丢帧
2022-06-28 12:19:00 【屁小猪】
udp丢包情况:
1.连续发送数据包太快 (每发一包数据usleep(40));
2.发送数据包太长 (数据进行切割成1400byte发送);
3.接收端处理时间过长导致丢包:调用recv方法接收端收到数据 后,处理数据花了一些时间,处理完后再次调用recv方法,
在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。
4.发送的包较大,超过接受者缓存导致丢包:包超过mtu size数倍,几个大的udp包可能会超过接收者的缓冲,导致丢包。
这种情况可以设置socket接收缓冲。以前遇到过这种问题,我把接收缓冲设置成64K就解决了。
Socket缓冲区大小修改与系统设置:(每个Socket在Linux中都映射为一个文件,并与内核中两个缓冲区(读缓冲区、写缓冲区)相关联。或者说,每个Socket拥有两个内核缓冲区。有时,我们需要修改缓冲区的内核限制的最大值,使其符合我们的实际需求)
cat /proc/sys/net/core/rmem_max 212992
rmem_max:一个Socket的读缓冲区可由程序设置的最大值,单位字节;
wmem_max:一个Socket的写缓冲区可由程序设置的最大值,单位字节;
rmem_default:一个Socket的被创建出来时,默认的读缓冲区大小,单位字节;
wmem_default:一个Socket的被创建出来时,默认的写缓冲区大小,单位字节;
应用程序级修改缓冲区大小
我们可以在程序中动态地修改(通过setsockopt系统调用)持有的有效Socket的读写缓冲区大小。
复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage: %s $RCFBUFSIZE
", argv[0]);
goto error;
}
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
printf("create socket error=%d(%s)!!!
", errno, strerror(errno));
goto error;
}
// 查看系统默认的socket接收缓冲区大小
int defRcvBufSize = -1;
socklen_t optlen = sizeof(defRcvBufSize);
if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &defRcvBufSize, &optlen) < 0)
{
printf("getsockopt error=%d(%s)!!!
", errno, strerror(errno));
goto error;
}
printf("OS default udp socket recv buff size is: %d
", defRcvBufSize);
// 按照执行参数设置UDP SOCKET接收缓冲区大小
int rcvBufSize = atoi(argv[1]);
if (rcvBufSize <= 0)
{
printf("rcvBufSize(%d) <= 0, error!!!
", rcvBufSize);
goto error;
}
printf("you want to set udp socket recv buff size to %d
", rcvBufSize);
optlen = sizeof(rcvBufSize);
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvBufSize, optlen) < 0)
{
printf("setsockopt error=%d(%s)!!!
", errno, strerror(errno));
goto error;
}
printf("set udp socket(%d) recv buff size to %d OK!!!
", sockfd, rcvBufSize);
// 查看当前UDP SOCKET接收缓冲区大小
int curRcvBufSize = -1;
optlen = sizeof(curRcvBufSize);
if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &curRcvBufSize, &optlen) < 0)
{
printf("getsockopt error=%d(%s)!!!
", errno, strerror(errno));
goto error;
}
printf("OS current udp socket(%d) recv buff size is: %d
", curRcvBufSize);
close(sockfd);
exit(0);
error:
if (sockfd >= 0)
close(sockfd);
exit(1);
}
边栏推荐
- Unity load settings: application backgroundLoadingPriority
- Using MySQL database in the express framework of node
- Deep learning has a new pit! The University of Sydney proposed a new cross modal task, using text to guide image matting
- Sha256 encryption tool class
- pwn入门(1)二进制基础
- Unity Editor Extension Foundation, guilayout
- Redis 原理 - List
- 关于字符串转换的一些小技巧
- 【Unity编辑器扩展基础】、GUI
- [unity Editor Extension practice] dynamically generate UI code using TXT template
猜你喜欢

websocket 1 分钟自动断开连接

Leetcode 48. 旋转图像(可以,已解决)

RemoteViews的作用及原理

Many benefits of SEO optimization are directly related to traffic

Prefix and (2D)

智联招聘基于 Nebula Graph 的推荐实践分享

JNI confusion of Android Application Security
![[C language] about scanf() and scanf_ Some problems of s()](/img/d1/e3d0b845e699c8c1fe3eb9f3b250e1.png)
[C language] about scanf() and scanf_ Some problems of s()

【Unity编辑器扩展实践】、通过代码查找所有预制

Source code analysis of ArrayList
随机推荐
Two writing methods of JNI function
Tips for using ugui (V) using scroll rect component
Many benefits of SEO optimization are directly related to traffic
Setting overridesorting for canvas does not take effect
【C语言】如何很好的实现复数类型
请问通达信股票软件可靠吗?在上面交易股票安全吗?
杰理之wif 干扰蓝牙【篇】
为什么CAD导出PDF没有颜色
fatal: unsafe repository (‘/home/anji/gopath/src/gateway‘ is owned by someone else)
【Unity编辑器扩展基础】、EditorGUILayout(二)
Ugui uses tips (VI) unity to realize vertical line display of string
杰理之wif 干扰蓝牙【篇】
运维思考 | 你知道CMDB与监控是什么关系吗?
真正的学懂三极管入门篇(经典)「建议收藏」
AcWing 604. Area of circle (implemented in C language)
C语言 sprintf函数使用详解
最新汇总!30省份公布2022高考分数线
Build your own website (18)
What is the difference between internal oscillator, passive crystal oscillator and active crystal oscillator?
PrecomputedTextCompat用法及原理