多线程 UDP传输速率 实验

现阶段问题:丢包问题 丢包率达到50%,但是ping的时候反应良好

1. 分析UDP丢包的原因:

1)现象是每隔一个包丢失一个,所以考虑是否是缓冲区的问题
答:用不同数据包大小10、100、500、1500发现都是收一个丢一个,说明缓冲区大小并不是直接因素。因为如果缓冲区大小有影响,那应该是收几个丢一个会变化
2) 调用recvfrom方法接收到数据后,处理数据花费时间太长,再次调用recvfrom,两次调用间隔里,发过来的包可能丢失。
答: 将recvfrom后面的语句精简,还是一样的丢包率,所以感觉后面的语句好像也没有太多的影响
通过将接收到数据存入一个缓冲区,并迅速返回继续recvfrom,排除了这个原因
找到原因:小循环中数目是几,就是隔几个包丢一个包 这个是因为什么呢?
解决:发现是for循环里的问题,每次encode的时候有一个i++,小循环跳出后又空加一个i++,所以出现了每个小循环后必丢包的现象。

2.接收端速率严重下滑的原因确定

1)在发送端速率19M的时候,接收端速率最高只有9M,在本机上实验,发现是每次的输出影响,包数量过多的情况下,会严重影响接收速率。

学到的一些技巧

1.设置UDP的发送和接收缓冲区

在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节
(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据
和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:

// 接收缓冲区
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int nSendBuf=3*1024*1024;//设置为3M
setsockopt(s,SOL_SOCKET, SO_SNDBUF, (const char*)&nSendBuf,sizeof(int));

setsockopt函数的详解

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
sockfd:	标识一个套接字的描述字
level: 选项定义的层次:支持SOL_SOCKET, IPPROTO_TCP, IPPROTO_IP,和IPPROTO_IPV6
optname:需设置得选项 SO_RCVBUF(接收缓冲区)SO_SNDBUF(发送缓冲区)
optval:指针,指向存放选项待设置的新值的缓冲区
optlen:optval的大小

你可能感兴趣的:(socket)