socket网收缓冲区余量的实时监视

时间:2020-12-20 23:55:21
windows下的UDP网收程序,如果数据流速过大,将易导致socket网收缓冲区溢出,从而导致数据丢失。

请问在网收数据过程中,如何能够实时监视socket的网收缓冲区余量是多少?

谢谢解答!

15 个解决方案

#1


解决 导致socket网收缓冲区溢出 的问题,从监视缓冲区空闲是不能解决问题的。

可以将client socket 的delay,linger 属性禁用。

server端采用成熟的网络模型,如raknet

#2


引用楼主 haowangyi 的回复:
windows下的UDP网收程序,如果数据流速过大,将易导致socket网收缓冲区溢出,从而导致数据丢失。

请问在网收数据过程中,如何能够实时监视socket的网收缓冲区余量是多少?

谢谢解答!

楼主不是内地的吧,怎么感觉说话怪怪的…………
貌似没有办法查看缓冲区中还剩多少数据,只能通过你自己的协议分析这个包还有多少数据没接收

#3


一般是自己的处理问题

#4


不太需要吧..即时收到了后保存到buffer里.不就完了嘛.

#5


用setsockopt,SO_RCVBUF设置大一点的接收缓冲区吧,优化下自己的代码,让程序快速接收数据,让客户端根据send的返回值,循环发送数据

#6


引用 2 楼 shenyi0106 的回复:
引用楼主 haowangyi 的回复:
windows下的UDP网收程序,如果数据流速过大,将易导致socket网收缓冲区溢出,从而导致数据丢失。

请问在网收数据过程中,如何能够实时监视socket的网收缓冲区余量是多少?

谢谢解答!

楼主不是内地的吧,怎么感觉说话怪怪的…………
貌似没有办法查看缓冲区中还剩多少数据,只能通过你自己的协议分析这个包还有多少数据没接收


我是纯正内地人,八辈子贫农出身。

linux下好像是有接口可以查看的。就是想看看

#7


引用 5 楼 fishion 的回复:
用setsockopt,SO_RCVBUF设置大一点的接收缓冲区吧,优化下自己的代码,让程序快速接收数据,让客户端根据send的返回值,循环发送数据


缓冲区最大能设置多大?

现在不想改动代码了。
目前的情况是网收线程接收数据后,进行处理,然后转发,再接收...不断循环...
如果数据流速大,网收线程来不及接收就会造成socket缓冲区溢出导致丢帧。
想测测在不同流速下,socket缓冲区余量的变化情况。

#8


做个环形缓冲区不就行了么?
比如环形缓冲区设置为10K,收到便处理,移动指针。只要再增加收到指针和处理指针就OK了。
在实际项目应用中都这么做的。

#9


可以设置较大的缓冲区

#10


不要轻易怀疑TCP底层,基本都是自己处理的问题,你确保每包数据recvfrom都完整吗?
不相信可以
if(_recvBuffSize > 0)
setsockopt(_socket, SOL_SOCKET, SO_RCVBUF, (char*)&_recvBuffSize, sizeof(_recvBuffSize));
if(_sendBufferSize > 0)
setsockopt(_socket, SOL_SOCKET, SO_SNDBUF, (char*)&_sendBufferSize, sizeof(_sendBufferSize));

自己设置下。 

#11


好像没听说过数据流速过快导致溢出
一般都是网速过慢导致丢弃

#12


引用楼主 haowangyi 的回复:
windows下的UDP网收程序,如果数据流速过大,将易导致socket网收缓冲区溢出,从而导致数据丢失。

请问在网收数据过程中,如何能够实时监视socket的网收缓冲区余量是多少?

谢谢解答!


数据过大就分包.实时监视socket的网收缓冲区余量.这纯属egg pain

#13


引用 12 楼 smwhotjay 的回复:
引用楼主 haowangyi 的回复:
windows下的UDP网收程序,如果数据流速过大,将易导致socket网收缓冲区溢出,从而导致数据丢失。

请问在网收数据过程中,如何能够实时监视socket的网收缓冲区余量是多少?

谢谢解答!


数据过大就分包.实时监视socket的网收缓冲区余量.这纯属egg pain


数据流速大,不是数据包大,请先看清楚问题。
先确认一下自己是否egg pain

#14


引用 8 楼 jingfeng710 的回复:
做个环形缓冲区不就行了么?
比如环形缓冲区设置为10K,收到便处理,移动指针。只要再增加收到指针和处理指针就OK了。
在实际项目应用中都这么做的。

环形缓冲区可以解决问题,但是我只是想测测在不同流速下,socket缓冲区余量的变化情况。

#15


引用 9 楼 vcf_reader 的回复:
可以设置较大的缓冲区

理论上,再大的缓冲区也不能根本解决问题

#1


解决 导致socket网收缓冲区溢出 的问题,从监视缓冲区空闲是不能解决问题的。

可以将client socket 的delay,linger 属性禁用。

server端采用成熟的网络模型,如raknet

#2


引用楼主 haowangyi 的回复:
windows下的UDP网收程序,如果数据流速过大,将易导致socket网收缓冲区溢出,从而导致数据丢失。

请问在网收数据过程中,如何能够实时监视socket的网收缓冲区余量是多少?

谢谢解答!

楼主不是内地的吧,怎么感觉说话怪怪的…………
貌似没有办法查看缓冲区中还剩多少数据,只能通过你自己的协议分析这个包还有多少数据没接收

#3


一般是自己的处理问题

#4


不太需要吧..即时收到了后保存到buffer里.不就完了嘛.

#5


用setsockopt,SO_RCVBUF设置大一点的接收缓冲区吧,优化下自己的代码,让程序快速接收数据,让客户端根据send的返回值,循环发送数据

#6


引用 2 楼 shenyi0106 的回复:
引用楼主 haowangyi 的回复:
windows下的UDP网收程序,如果数据流速过大,将易导致socket网收缓冲区溢出,从而导致数据丢失。

请问在网收数据过程中,如何能够实时监视socket的网收缓冲区余量是多少?

谢谢解答!

楼主不是内地的吧,怎么感觉说话怪怪的…………
貌似没有办法查看缓冲区中还剩多少数据,只能通过你自己的协议分析这个包还有多少数据没接收


我是纯正内地人,八辈子贫农出身。

linux下好像是有接口可以查看的。就是想看看

#7


引用 5 楼 fishion 的回复:
用setsockopt,SO_RCVBUF设置大一点的接收缓冲区吧,优化下自己的代码,让程序快速接收数据,让客户端根据send的返回值,循环发送数据


缓冲区最大能设置多大?

现在不想改动代码了。
目前的情况是网收线程接收数据后,进行处理,然后转发,再接收...不断循环...
如果数据流速大,网收线程来不及接收就会造成socket缓冲区溢出导致丢帧。
想测测在不同流速下,socket缓冲区余量的变化情况。

#8


做个环形缓冲区不就行了么?
比如环形缓冲区设置为10K,收到便处理,移动指针。只要再增加收到指针和处理指针就OK了。
在实际项目应用中都这么做的。

#9


可以设置较大的缓冲区

#10


不要轻易怀疑TCP底层,基本都是自己处理的问题,你确保每包数据recvfrom都完整吗?
不相信可以
if(_recvBuffSize > 0)
setsockopt(_socket, SOL_SOCKET, SO_RCVBUF, (char*)&_recvBuffSize, sizeof(_recvBuffSize));
if(_sendBufferSize > 0)
setsockopt(_socket, SOL_SOCKET, SO_SNDBUF, (char*)&_sendBufferSize, sizeof(_sendBufferSize));

自己设置下。 

#11


好像没听说过数据流速过快导致溢出
一般都是网速过慢导致丢弃

#12


引用楼主 haowangyi 的回复:
windows下的UDP网收程序,如果数据流速过大,将易导致socket网收缓冲区溢出,从而导致数据丢失。

请问在网收数据过程中,如何能够实时监视socket的网收缓冲区余量是多少?

谢谢解答!


数据过大就分包.实时监视socket的网收缓冲区余量.这纯属egg pain

#13


引用 12 楼 smwhotjay 的回复:
引用楼主 haowangyi 的回复:
windows下的UDP网收程序,如果数据流速过大,将易导致socket网收缓冲区溢出,从而导致数据丢失。

请问在网收数据过程中,如何能够实时监视socket的网收缓冲区余量是多少?

谢谢解答!


数据过大就分包.实时监视socket的网收缓冲区余量.这纯属egg pain


数据流速大,不是数据包大,请先看清楚问题。
先确认一下自己是否egg pain

#14


引用 8 楼 jingfeng710 的回复:
做个环形缓冲区不就行了么?
比如环形缓冲区设置为10K,收到便处理,移动指针。只要再增加收到指针和处理指针就OK了。
在实际项目应用中都这么做的。

环形缓冲区可以解决问题,但是我只是想测测在不同流速下,socket缓冲区余量的变化情况。

#15


引用 9 楼 vcf_reader 的回复:
可以设置较大的缓冲区

理论上,再大的缓冲区也不能根本解决问题