请问在网收数据过程中,如何能够实时监视socket的网收缓冲区余量是多少?
谢谢解答!
15 个解决方案
#1
解决 导致socket网收缓冲区溢出 的问题,从监视缓冲区空闲是不能解决问题的。
可以将client socket 的delay,linger 属性禁用。
server端采用成熟的网络模型,如raknet
可以将client socket 的delay,linger 属性禁用。
server端采用成熟的网络模型,如raknet
#2
楼主不是内地的吧,怎么感觉说话怪怪的…………
貌似没有办法查看缓冲区中还剩多少数据,只能通过你自己的协议分析这个包还有多少数据没接收
#3
一般是自己的处理问题
#4
不太需要吧..即时收到了后保存到buffer里.不就完了嘛.
#5
用setsockopt,SO_RCVBUF设置大一点的接收缓冲区吧,优化下自己的代码,让程序快速接收数据,让客户端根据send的返回值,循环发送数据
#6
我是纯正内地人,八辈子贫农出身。
linux下好像是有接口可以查看的。就是想看看
#7
缓冲区最大能设置多大?
现在不想改动代码了。
目前的情况是网收线程接收数据后,进行处理,然后转发,再接收...不断循环...
如果数据流速大,网收线程来不及接收就会造成socket缓冲区溢出导致丢帧。
想测测在不同流速下,socket缓冲区余量的变化情况。
#8
做个环形缓冲区不就行了么?
比如环形缓冲区设置为10K,收到便处理,移动指针。只要再增加收到指针和处理指针就OK了。
在实际项目应用中都这么做的。
比如环形缓冲区设置为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));
自己设置下。
不相信可以
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
数据过大就分包.实时监视socket的网收缓冲区余量.这纯属egg pain
#13
数据流速大,不是数据包大,请先看清楚问题。
先确认一下自己是否egg pain
#14
环形缓冲区可以解决问题,但是我只是想测测在不同流速下,socket缓冲区余量的变化情况。
#15
理论上,再大的缓冲区也不能根本解决问题
#1
解决 导致socket网收缓冲区溢出 的问题,从监视缓冲区空闲是不能解决问题的。
可以将client socket 的delay,linger 属性禁用。
server端采用成熟的网络模型,如raknet
可以将client socket 的delay,linger 属性禁用。
server端采用成熟的网络模型,如raknet
#2
楼主不是内地的吧,怎么感觉说话怪怪的…………
貌似没有办法查看缓冲区中还剩多少数据,只能通过你自己的协议分析这个包还有多少数据没接收
#3
一般是自己的处理问题
#4
不太需要吧..即时收到了后保存到buffer里.不就完了嘛.
#5
用setsockopt,SO_RCVBUF设置大一点的接收缓冲区吧,优化下自己的代码,让程序快速接收数据,让客户端根据send的返回值,循环发送数据
#6
我是纯正内地人,八辈子贫农出身。
linux下好像是有接口可以查看的。就是想看看
#7
缓冲区最大能设置多大?
现在不想改动代码了。
目前的情况是网收线程接收数据后,进行处理,然后转发,再接收...不断循环...
如果数据流速大,网收线程来不及接收就会造成socket缓冲区溢出导致丢帧。
想测测在不同流速下,socket缓冲区余量的变化情况。
#8
做个环形缓冲区不就行了么?
比如环形缓冲区设置为10K,收到便处理,移动指针。只要再增加收到指针和处理指针就OK了。
在实际项目应用中都这么做的。
比如环形缓冲区设置为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));
自己设置下。
不相信可以
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
数据过大就分包.实时监视socket的网收缓冲区余量.这纯属egg pain
#13
数据流速大,不是数据包大,请先看清楚问题。
先确认一下自己是否egg pain
#14
环形缓冲区可以解决问题,但是我只是想测测在不同流速下,socket缓冲区余量的变化情况。
#15
理论上,再大的缓冲区也不能根本解决问题