UDP通信(二)
最近的工作需要使用udp进行通信。因为有了之前的了解与学习,因此前面都进行的很顺利,通信双方都能正常收到消息。
但后来问题出现了,发现有时在接收端接收到的消息不完整,简而言之就是偶尔会丢包,且时间、频率均不可知。经过一系列的排查,发现发送端正常工作,所有数据均已发送过去,但接收端有时会接收不到。通过查阅资料,发现这个可能是接收端缓冲区的问题。正如读写文件时,系统会先设立一个读缓冲区和写缓冲区,将数据全部放入缓冲区中,当缓冲区满时,才会将所有数据一次性写入文件中或从文件中读出。在利用UDP通信时,系统同样会在内存中设立一个发送缓冲区和接收缓冲区,当缓冲区满时,才会一次性对缓冲区内数据进行操作。当发送的数据过多,而接收缓冲区设置得没那么大时,就会出现丢包现象。解决办法就是将接收缓冲区设置得大一些。利用setsockopt() 函数来设置缓冲区大小:
#include <[sys/socket.h](https://pubs.opengroup.org/onlinepubs/000095399/basedefs/sys/socket.h.html)>
int setsockopt(int *socket* , int *level* , int *option_name* ,
const void **option_value* , socklen_t *option_len* );
其中每个参数的含义
// socket:为自己创建的socket套接字
// level:一般使用SOL_SOCKET
// option_name: 选项名,常用SO_SNDBUF和SO_RCVBUF,分别用来设置发送缓冲区和接收缓冲区的大小
// option_value: option_name的值
// option_len: option_value所占字节数
评论
0 评论