第二人生的源码分析(三十一)接收数据的流量控制

数据接收回来后,本来就应立即处理掉,这样是比较简单的想法。但由于网络带宽有限,这时就需要限制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-07-31 13:45:38

第二人生的源码分析(三十一)接收数据的流量控制的相关文章

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