数据接收回来后,本来就应立即处理掉,这样是比较简单的想法。但由于网络带宽有限,这时就需要限制UDP接收数据的速度。下面就来分析这种需求的实现,它的代码如下:
#001 S32 LLPacketRing::receivePacket (S32 socket, char *datap)
#002 {
#003 S32 packet_size = 0;
#004
下面判断是否使用接收的流量限制。
#005 // If using the throttle, simulate a limited size input buffer.
#006 if (mUseInThrottle)
#007 {
#008 BOOL done = FALSE;
#009
#010 // push any current net packet (if any) onto delay ring
下面开始循环地接收数据,并且判断是否到达流量的最大值。
#011 while (!done)
#012 {
#013 LLPacketBuffer *packetp;
#014 packetp = new LLPacketBuffer(socket);
#015
上面创建LLPacketBuffer对象来接收数据。
#016 if (packetp->getSize())
#017 {
#018 mActualBitsIn += packetp->getSize() * 8;
#019
#020 // Fake packet loss
#021 &n
第二人生的源码分析(三十一)接收数据的流量控制
时间: 2024-12-26 20:20:27
第二人生的源码分析(三十一)接收数据的流量控制的相关文章
HDFS源码分析心跳汇报之数据块汇报
在<HDFS源码分析心跳汇报之数据块增量汇报>一文中,我们详细介绍了数据块增量汇报的内容,了解到它是时间间隔更长的正常数据块汇报周期内一个smaller的数据块汇报,它负责将DataNode上数据块的变化情况及时汇报给NameNode.那么,时间间隔更长的正常数据块汇报都做了些什么呢?本文,我们将开始研究下时间间隔更长的正常数据块汇报. 首先,看下正常数据块汇报是如何发起的?我们先看下BPServiceActor工作线程的offerService()方法: /*
HDFS源码分析心跳汇报之数据块增量汇报
在<HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程>一文中,我们详细了解了数据节点DataNode周期性发送心跳给名字节点NameNode的BPServiceActor工作线程,了解了它实现心跳的大体流程: 1.与NameNode握手: 1.1.第一阶段:获取命名空间信息并验证.设置: 1.2.第二阶段:DataNode注册: 2.周期性调用sendHeartBeat
HDFS源码分析DataXceiver之读数据块
在<HDFS源码分析DataXceiver之整体流程>一文中我们知道,无论来自客户端还是其他数据节点的请求达到DataNode时,DataNode上的后台线程DataXceiverServer均为每个请求创建一个单独的后台工作线程来处理,这个工作线程就是DataXceiver.并且,在线程DataXceiver处理请求的主方法run()方法内,会先读取操作符op,然后根据操作符op分别调用相应的方法进行请求的处理.而决定什么样的操作符op该调用何种方法的逻辑,则是在DataX
QEMU1.3.0的源码分析三:user model之linux
从源码目录来看,user model有两块内容bsd-user和linux-user.我主要研究了下linux-user这种情况. 首先要提一下通常容易关注的焦点,linux-user下的函数入口点:/源码目录/linux-user/main.c中的 Line:3388 int main(int argc, char **argv, char **envp). 找到了入口函数,就可以根据这个main函数中的调用关系来看看这个情况下的主要执行流程和动作了. int main(int argc
第二人生的源码分析(四十三)虚拟文件系统线程
由于第二人生是一个3D显示的软件,因此它就需要不断地从服务器下载大量数据,比如纹理图片,不同的角色是使用不同的纹理图片来实现不同的衣服外表的.当显示这些角色时,就使用从服务器下载的纹理图片.如果显示的人物角色比较多,比如有30个人时,这些纹理图片就需要保存到磁盘里.那么怎么样保存到磁盘里呢?保存到磁盘里就需要一个好的文件系统来保存,以及读取数据出来.读写磁盘是一项比较慢的工作,因此需要使用一个线程来实现.还有时读写文件并不需要及时性的动作,可以让线程等到CPU空闲时再去做这些事情. LLVF
第二人生的源码分析(四十四)虚拟文件系统的请求处理
在虚拟文件系统的消息队列里,主要就是LLVFSThread::Request类的请求,Request类是嵌套类,定义在LLVFSThread类里面.它主要实现对类LLVFS的封装访问,让操作更加方便一些,当然它是继续QueuedRequest类的,这样才可以添加到消息队列里去,否则不能添加到这个消息队列容器,也不能实现请求处理的多态了. 下面是类Request的构造函数. #001 LLVFSThread::Request::Request(handle_t handle, U32 prio
Kafka源码分析之KafkaProducer发送数据send()方法
KafkaProducer是Kafka中Producer的一种实现,其主要功能就是发送消息给Kafka中broker.其send()方法如下: /** * Asynchronously send a record to a topic. Equivalent to <code>send(record, null)</code>. * See {@link #send(ProducerRecord, Callback)} for details. */ @Overri
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点_jquery
什么情况下使用到克隆节点? 我们知道在对DOM操作过程中如果直接使用节点会出现节点随操作而变动的情况.比如对节点使用.after/.before/.append等方法后,节点被添加到新的地方,原来的位置上的节点被移除了.有的时候需要保留原来位置上的节点,仅仅是需要一个副本添加到对应位置,这个时候克隆就有了使用场景. jQuery.fn.clone克隆当前匹配元素集合的一个副本,并以jQuery对象的形式返回. 你还可以指定是否复制这些匹配元素(甚至它们的子元素)的附加数据( data()函数 )
java io学习(三) 管道的简介,源码分析和示例
管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例 本章,我们对java 管道进行学习. java 管道介绍 在java中,PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流. 它们的作用是让多线程可以通过管道进行线程间的通讯.在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用. 使用管道通信时,大致的流程是:我们在线程A中向PipedOutputStr