经过今天的测试,未发现有内存泄露; 局网为全千兆网络; 接收缓冲区设置为4*1024*1024,应该够了吧;
[quote=引用 21 楼 vbcrack 的回复:] 谢谢各位指导!!! 发送端是由硬件完成,没有办法提供可靠传输,现在只能在接收端想办法。 程序内存是否存在泄漏还在排查,接收端的接收缓冲已经改成了4*1024*1024。 请教下,有没有办法清理socket接收端的缓冲,避免接收缓冲溢出?
谢谢各位指导!!! 发送端是由硬件完成,没有办法提供可靠传输,现在只能在接收端想办法。 程序内存是否存在泄漏还在排查,接收端的接收缓冲已经改成了4*1024*1024。 请教下,有没有办法清理socket接收端的缓冲,避免接收缓冲溢出?
你只是单纯使用recvfrom进行的包接收测试吧? 没有对UDP加入自己的可靠传输模式, 如果是这样的话应该是正常的,udp本身就是不可靠,乱序的 首先 sendto 发送端,当socket发送缓冲占满,会有阶段性丢包出现 其次 recvfrom 接收端 当socket接收缓冲满,由于TCP/IP协议栈是运行在内核态,因此你的recvfrom并不会在用户态被立即调用,而且由于TCP/IP协议栈的内部锁的存在,这个时候是线性执行,而不是并发执行,那么后续包会被丢弃,也就是出现你说的 抓包可以抓到,但是你的程序接收不到的现象,因为用户太无法及时响应,导致内核态的缓冲长时间处于高负载状态,结局就是,随着时间的推移丢包越来越多。 你如果只想简单的临时化解,可以采用的方法是 [1] 增加接收端socket的接收缓冲大小例如到 5*1024*1024, set socket opl [2] 检测发送端sendto 的返回值,当出现SOCKET——ERROR,使用select 等SOCKET缓冲被清除 使用这两步操作,在1000Mbps环境下,只要你的CPU够强,处理逻辑够简单,一般就没有什么大问题 终极解决还是要自己编写可靠UDP传输,可以参考开源的例如 udt , 或者 http://enet.bespin.org/ 这些都是很不错的简单UDP可靠传输的实现
你接收端的代码是怎么写的,一个单独的线程,循环recvfrom()?
18,363
社区成员
64,187
社区内容
加载中
试试用AI创作助手写篇文章吧