??xml version="1.0" encoding="utf-8" standalone="yes"?> 今天在公司看?/span>VIA?/span>CBPpdCDMA手机Ҏ(gu)用到?/span>Nucleus +OSQ说实话q是W一ơ听_(d)所以查?jin)些资料Q引用别人的ȝ做个癄文Q原文链接如下:(x) http://www.upsdn.net/html/2005-01/250.html Nucleus PLUS嵌入式操作系l是目前最受欢q的操作pȝ之一Q是国源代码操作系l商ATI公司为实时嵌入式应用而设计的一?span style="COLOR: red">抢先式多d操作pȝ内核Q其95Q的代码是用ANSIC写成的,因此非常便于ULq能够支持大多数cd的处理器?/span> 从实现角度来看,Nucleus PLUS 是一l?/span>C函数库,应用E序代码与核?j)函数库q接在一P生成一个目标代码,下蝲到目标板?/span>RAM中或直接烧录到目标板?/span>ROM中执行?/span> Nucleus Plus内核在典型的CISC体系l构上占据大U?/span>20kI间Q而在典型?/span>RISC体系l构上占据空间ؓ(f)40k左右Q其内核数据l构占据1.5k字节的空间?/span>Nucleus Plus以其实时响应、抢先、多d以及(qing)源代码开?/span>Ҏ(gu)获得在通讯、国阌Ӏ工业控制、航I?/span>/航天、铁路、网l?/span>POS、自动化控制、智能家늭领域的广泛应用?/span> Nucleus PLUS 采用?span style="COLOR: red">软glg的方?/span>。每个组件具?span style="COLOR: red">单一而明的目的Q通常由几?/span>C?qing)汇~语a模块构成Q提供清晰的外部接口Q对lg的引用就是通过q些接口完成的。除?jin)少C些特D情况外Q不允许从外部对lg内的全局q行讉K。由于采用了(jin)软glg的方法,Nucleus PLUS各个lg非常易于替换和复?/span>?/span>Nucleus PLUS的组件包括Q务控制、内存管理、Q务间通信、Q务的同步与互斥、中断管理、定时器?/span>I/O驱动{?/span> Nucleus PLUS提供注释严格?/span>C源代码l每一个用戗这P用户能够深入C(jin)解底层内核的q作方式Qƈ可根据自qҎ(gu)要求删减或改动系lYӞq对软g的规范化理?qing)系lY件的试都有极大的帮助。另外,׃提供?/span>RTOS的源U代码,用户不但可以q行 RTOS 的学?fn)和研究Q而且产品在量产时也不必支?/span> LicenseQ可以省d量的费用。对于军Ҏ(gu)_(d)׃提供?jin)源代码Q用户完全可以控制内核而不必担?j)操作系l中可能?x)存在异怓Q务导致系l崩溃?/span> Nucleus PLUS׃采用?jin)先q的微内?/span> ( Micro-kernel ) 技术,因而在优先U安排,d调度QQ务切换等各个斚w都有相当大的优势。另外,?/span>C++语言的全面支持又使得Nucleus PLUS ?/span> Kernel 成ؓ(f)名副其实的面向对象的实时操作pȝ内核。然而,其h(hun)格却比较合理。所以,Ҏ(gu)被广大的研发单位接受?/span> Nucleus PLUS 能够l合 ParadigmQ?/span>SDS以及(qing) ATI自己的多d调试器组成功能强大的集成开发环境,配合相应的编译器和动态联l库以及(qing)各类底层驱动软gQ用户可以轻村֜q行 RTOS 的开发和调试。另外,׃q些集成开发环?/span> ( IDE ) 为所有的开发工E师所熟?zhn)Q因而,Ҏ(gu)学习(fn)和用?/span> Nucleus PLUS除提供功能强大的内核操作pȝ外,q提供种cM富的功能模块。例如用于通讯pȝ的局域和q域|络模块Q支持图形应用的实时?/span>Windows模块Q支?/span>Internet|的WEB产品模块Q工控机实时BIOS模块Q图形化用户接口以及(qing)应用软g性能分析模块{。用户可以根据自q应用来选择不同的应用模块?/span> Nucleus PLUS?/span>RTOS内核可支持如下类型的CPUQ?/span>x86,68xxx,68HCxx,NEC V25, ColdFire, 29K,i960, MIPS, SPARClite, TI DSP, ARM6/7, StrongARM, H8/300H, SH 值得提出的是ATI公司最q还发表?jin)基?/span>Microsoft Developers Studio的嵌入式集成开发环境-NUCLEUS EDE。从而率先将嵌入式开发工具与Microsoft的强大开发环境结合v来,提供l工E师们强大的开发手Dc(din)?/span> q除商务上给用户带来巨大益处Q免?/span>RoyaltyQ外Q还在技术方面给用户极大的方便,x需~写和调?/span>BSPQ从而达到易学易用的目的Q加速品上?jng)。对RTOS有一定知识的工程师一定清楚,使用RTOS最大的障碍在于~写和调?/span>BSP。大家知道,在调试目标系l的软g之前Q必d目标与主接v来ƈ建立通讯。ؓ(f)此,我们可以~写一D늛控程序(MonitorQ。然而,如果要调试基?/span>RTOS内核的程序,L上的调试器(DebuggerQ除要与目标建立通讯外,更重要的是必识?/span>RTOS的Q务,q样才能q行dU调试(Task-aware DebuggerQ。因此,只有Monitor是不够的。如果我们选用?/span>RTOS不提供源代码Q那么,L上的调试器(DebuggerQ就只有通过用户~写?/span>BSP来了(jin)?/span>Kernel在现有硬件^C对各个Q务进行调度的情况。显?dng)~写BSP必须?/span>CPU目标pȝ的硬件以?qing)应用Y件等有全面而深入的?jin)解。一般说来,对于一个有一定硬件开发经验的工程师来_(d)~写一个新?/span>BSP要花的^均时间ؓ(f)两个月左叟뀂这对于一个新手来说可是比较困隄。对于编?/span>BSP的工E师来说Q另外一个更大的挑战是如何调试BSPQ即如何验证所~写?/span>BSP是否正确。通常刚刚焊接安装好的PCB板中Q硬件或软g的故障(BugsQ是比较多的。甚x常见的是CPU部分都没有运作正常。有时时序错误和ȝ错误都还存在。在(zhn)把写好?/span>BSP烧入EPROMQ或FLASHQ中试图目标与L建立联系Ӟ(zhn)几?/span>100%C(x)发现Ҏ(gu)无法通讯Q眼前一团漆黑,不知是Y件有错误q是g不运转?/span>BSP在正常运行吗Q不得而知。在焦急和摸烦(ch)中?zhn)可能发现几个月已?zhn)然而过。对于早期的实时操作pȝ来说Q?/span>BSP是必׃路。然而,C代的RTOS-Nucleus PLUS则避免了(jin)BSP带来的痛苦过E。因?/span>Nucleus的调试是Z全新的动态连接库Q?/span>DLLQ。用户只通过监控E序Q?/span>MonitorQ或?/span>BDM调试口(或?/span>JTAG调试口)(j)建立目标pȝQ?/span>TargetQ与LQ?/span>HostQ之间的通讯Qƈl主Z?/span>Debugger初始化特性中加入Nucleus的动态连接库Q?/span>DLLsQ,q时Q调试器p够自动地去识别运行在目标pȝ中的Nucleus内核和各个应用Q务,从而完成Q务调试。上q的动态连接库Q?/span>DLLsQ是?/span>RTOS厂商?/span>Debugger厂商合作完成的,用户无须自行~写。因此,Nucleus的用户只需要将_֊攑֜ZNucleus的编E工作中。对于一个新手,往往l过一天到两天的学?fn)和培训Q就可以投入到应用程序编制工作中去,无需花大量的旉ȝI?/span>CPUQ特定的g{?/span> 另外Q由于有?jin)源E序Q用户在调试E序时可以清楚地通过STEP INTO命o(h)Q追t到RTOS的内层中去,观看和学?/span>Kernel对Q务的理和调度机制。对于有志研I?/span>RTOS深层技术的工程师来说极为方ѝ对?/span>Motorola 68K?/span>PowerPCQ用户可以利?/span>GreenHill公司?/span>Mutil调试器或TRACE-ICD来完?/span>Nucleus PLUS的调试;对于ARM?/span>StrongARMQ用户可以利?/span>ARM公司?/span>SDT251调试器或TRACE-ICD来完?/span>Nucleus PLUS的调试;对于Intel x86实模式,用户可以利用Paradigm公司的调试器?qing)?/span>DLL来进行Q务调试Q对?/span>Intel x86保护模式则可以利?/span>SSI公司Softprobe调试器和SSI DLL来调试;对于i960Q?/span>SH3/4Q?/span>ARM6/7Q?/span>MIPS{芯片,则可以?/span>ATI公司自己?/span>UDB调试器来q行d的调试。结论:(x)动态连接库Q?/span>DLLQ是?/span>RTOS工具中新出现的应用趋势,通过q种方式Q用户可以免?/span>BSP带来的麻?ch),灉|方便地进行开发和调试Q大大加速开发进度?/span>Nucleus实时操作pȝ提供源代码,支持丰富?/span>CPUU类Q配合各c?/span>DLL动态连接库Qؓ(f)使用和研I?/span>RTOS技术的工程带来极大的利益?/span> q行ARMpd的开发需要大量的讑֤投入Q另外如果做比较大型的系l,q必要操作pȝQ购?span style="COLOR: red">一个好的操作系l也是需要几十万?/span>?/span>ARM?span style="COLOR: red">应用层研发可以徏立在CQ?/span>CQ+?qing)其他的大多数开发语a上,q对于Y件公司来说是很方便的Q只要准备好g?qing)操作系l,其他的工作就可以分模块给N个h来进行。而对于底层的东西Q?/span>ARM公司也可以有比较大力度的支持Q因此如果需要用ARMpd开发高端品,可行性是比较高的Q开发周期也不会(x)很长。当?dng)对?/span>arm芯片Q还是有一定的限制Q比如没有除法指令,q样在编E时p量避免用除法,否则?x)带来程序代码的增加和执行速度的降低。一般说Q除法还是可以通过UM和乘法来代替?br>一?/span>Nucleus PLUS嵌入式操作系l的单介l?/span>
二?/span>Nucleush的优点:(x)
1、提供源代码
2、性h(hun)比高
3、易学易?/span>
4、功能模块丰?/span>
三?/span> 源代码带来的优势众所周知Q?/span>Nucleus实时多Q务操作系l提供给用户源代码?/span>
另外Q好久没上来码字?jin),上周l束׃Q估计金融危机对我的影响暂时l束一下了(jin)吧?/span>
关于C51内的codeQ?/span>idataQ?/span>xdata
以前没搞q?/span>C51Q大学时代跟单片师的时候也是捣鼓下汇编Q现在重新搞单片机,因ؓ(f)手头资料不多Q找C?/span>C51的程序,发现里面有这些关键字Q不甚明?jin),没办法只好找了(jin)下Q发现如下描qͼ(x)
从数据存储类型来_(d)8051pd?span style="COLOR: red">片内、片外程序存储器Q片内、片外数据存储器Q片内程序存储器q分直接d区和间接dcdQ分别对?/span>code?/span>data?/span>xdata?/span>idata以及(qing)Ҏ(gu)51pd特点而设定的pdatacdQ用不同的存储器,ɽE序执行效率不同Q在~写C51E序Ӟ最好指定变量的存储cdQ这样将有利于提高程序执行效?/span>(此问题将在后面专门讲q?/span>)。与ANSI-CE有不同Q它只分SAMLL?/span>COMPACT?/span>LARGE模式Q各U不同的模式对应不同的实际硬件系l,也将有不同的~译l果?/span>
?/span>51pd?/span>data,idata,xdata,pdata的区?/span>
data:固定指前?/span>0x00-0x
idata:固定指前?/span>0x00-0xff?/span>256?/span>RAM,其中?/span>128?/span>data?/span>128完全相同Q只是因问的方式不同?/span>idata是用cMC中的指针方式讉K的。汇~中的语句ؓ(f)Q?/span>mox ACC,@Rx.(不重要的补充Q?/span>c?/span>idata做指针式的访问效果很?/span>)
xdata:外部扩展RAMQ一般指外部0x0000-0xffffI间Q用DPTR讉K?/span>
pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rxd。这个比较特D,而且C51好象有对此BUGQ徏议少用。但也有他的优点Q具体用法属于中U问题,q里不提?/p>
可重入函C不可重入函数
主要用于多Q务环境中Q一个可重入的函数简单来说就是可以被中断的函敎ͼ也就是说Q可以在q个函数执行的Q何时M断它Q{?span lang=EN-US>OS调度下去执行另外一D代码,而返回控制时不会(x)出现什么错误;而不可重入的函数׃使用?jin)一些系l资源,比如全局变量区,中断向量表等Q所以它如果被中断的话,可能?x)出现问题,q类函数是不能运行在多Q务环境下的?span lang=EN-US>
也可以这L(fng)解,重入卌C重复进入,首先它意味着q个函数可以被中断,其次意味着它除?jin)用自己栈上的变量以外不依赖于M环境Q包?span lang=EN-US>staticQ,q样的函数就?span lang=EN-US>purecodeQ纯代码Q可重入Q可以允许有该函数的多个副本在运行,׃它们使用的是分离的栈Q所以不?x)互相干扰。如果确实需要访问全局变量Q包?span lang=EN-US>staticQ,一定要注意实施互斥手段。可重入函数在ƈ行运行环境中非常重要Q但是一般要问全局变量付出一些性能代h(hun)?span lang=EN-US>
~写可重入函数时Q若使用全局变量Q则应通过关中断、信号量Q即P?span lang=EN-US>V操作Q等手段对其加以保护?span lang=EN-US>
说明Q若Ҏ(gu)使用的全局变量不加以保护,则此函数׃h可重入性,卛_多个q程调用此函数时Q很有可能有关全局变量变ؓ(f)不可知状态?span lang=EN-US>
CZQ假?span lang=EN-US>Exam?span lang=EN-US>int型全局变量Q函?span lang=EN-US>Squre_Examq回Examqx倹{那么如下函Ch可重入性?span lang=EN-US>
unsigned int example( int para )
{
unsigned int temp;
Exam = para; // Q?span lang=EN-US>**Q?span lang=EN-US>
temp = Square_Exam( );
return temp;
}
此函数若被多个进E调用的话,其结果可能是未知的,因ؓ(f)当(**Q语句刚执行完后Q另外一个用本函数的进E可能正好被Ȁz,那么当新Ȁzȝq程执行到此函数ӞExam赋与另一个不同的para|所以当控制重新回到“temp = Square_Exam( )”后,计算出的temp很可能不是预想中的结果。此函数应如下改q?span lang=EN-US>
unsigned int example( int para ) {
unsigned int temp;
[甌信号量操?span lang=EN-US>] //(1)
Exam = para;
temp = Square_Exam( );
[释放信号量操?span lang=EN-US>]
return temp;
}
(1)若申请不?span lang=EN-US>“信号?span lang=EN-US>”Q说明另外的q程正处于给Exam赋值ƈ计算其^方过E中Q即正在使用此信P(j),本进E必ȝ待其释放信号后,才可l箋执行。若甌CP则可l箋执行Q但其它q程必须{待本进E释放信号量后,才能再用本信号?span lang=EN-US>
保证函数的可重入性的Ҏ(gu)Q?span lang=EN-US>
在写函数时候尽量用局部变量(例如寄存器、堆栈中的变量)(j)Q对于要使用的全局变量要加以保护(如采取关中断、信号量{方法)(j)Q这h成的函数׃定是一个可重入的函数?span lang=EN-US>
VxWorks中采取的可重入的技术有Q?span lang=EN-US>
* 动态堆栈变量(各子函数有自q立的堆栈I间Q?span lang=EN-US>
* 受保护的全局变量和静(rn)态变?span lang=EN-US>
* d变量
--------------------------------------------------
在实时系l的设计中,l常?x)出现多个Q务调用同一个函数的情况。如果这个函Cq被设计成ؓ(f)不可重入的函数的话,那么不同d调用q个函数时可能修改其他Q务调用这个函数的数据Q从而导致不可预料的后果。那么什么是可重入函数呢Q所谓可重入函数是指一个可以被多个d调用的过E,d在调用时不必担心(j)数据是否?x)出错。不可重入函数在实时pȝ设计中被视ؓ(f)不安全函数。满下列条件的函数多数是不可重入的Q?span lang=EN-US>
1) 函数体内使用?jin)?rn)态的数据l构Q?span lang=EN-US>
2) 函数体内调用?span lang=EN-US>malloc()或?span lang=EN-US>free()函数Q?span lang=EN-US>
3) 函数体内调用?jin)标?span lang=EN-US>I/O函数?span lang=EN-US>
下面举例加以说明?span lang=EN-US>
A. 可重入函?span lang=EN-US>
void strcpy(char *lpszDest, char *lpszSrc)
{
while(*lpszDest++=*lpszSrc++);
*dest=0;
}
B. 不可重入函数1
charcTemp;//全局变量
void SwapChar1(char *lpcX, char *lpcY)
{
cTemp=*lpcX;
*lpcX=*lpcY;
lpcY=cTemp;//讉K?jin)全局变量
}
C. 不可重入函数2
void SwapChar2(char *lpcX,char *lpcY)
{
static char cTemp;//?rn)态局部变?span lang=EN-US>
cTemp=*lpcX;
*lpcX=*lpcY;
lpcY=cTemp;//使用?jin)?rn)态局部变?span lang=EN-US>
}
问题1Q如何编写可重入的函敎ͼ
{:(x)在函C内不讉K那些全局变量Q不使用?rn)态局部变量,坚持只用局部变量,写出的函数就是可重入的。如果必访问全局变量Q记住利用互斥信号量来保护全局变量?span lang=EN-US>
问题2Q如何将一个不可重入的函数改写成可重入的函敎ͼ
{:(x)把一个不可重入函数变成可重入的唯一Ҏ(gu)是用可重入规则来重写它。其实很单,只要遵守?jin)几条很?gu)理解的规则,那么写出来的函数是可重入的?span lang=EN-US>
1) 不要使用全局变量。因为别的代码很可能覆盖q些变量倹{?span lang=EN-US>
2) 在和g发生交互的时候,切记执行cMdisinterrupt()之类的操作,是关闭g中断。完成交互记得打开中断Q在有些pd上,q叫?span lang=EN-US>“q入/退出核?span lang=EN-US>”?span lang=EN-US>
3) 不能调用其它M不可重入的函数?span lang=EN-US>
4) 谨慎使用堆栈。最好先在用前?span lang=EN-US>OS_ENTER_KERNAL?span lang=EN-US>
堆栈操作涉及(qing)内存分配Q稍不留就?x)造成益出D覆盖其他d的数据,所以,误}慎用堆栈!最好别用!很多黑客E序利用了(jin)q一点以便系l执行非法代码从而轻松获得系l控制权。还有一些规则,MQ时刻记住一句话Q保证中断是安全的!
实例问题Q曾l设计过如下一个函敎ͼ在代码检视的时候被提醒?span lang=EN-US>bugQ因个函数是不可重入的,Z么?
unsigned int sum_int( unsigned int base )
{
unsigned int index;
static unsigned int sum = 0; // 注意Q是staticcd
for (index = 1; index <= base; index++)
sum += index;
return sum;
}
分析Q所谓的函数是可重入的(也可以说是可预测的)(j)Q即只要输入数据相同应产生相同的输出。这个函C所以是不可预测的,是因ؓ(f)函数中用了(jin)static变量Q因?span lang=EN-US>static变量的特征,q样的函数被UCؓ(f)Q带“内部存储?span lang=EN-US>”功能的的函数。因此如果需要一个可重入的函敎ͼ一定要避免函数中?span lang=EN-US>static变量Q这U函C?span lang=EN-US>static变量Q用原则是Q能不用量不用?span lang=EN-US>
上面的函数修改为可重入的函敎ͼ只要声?span lang=EN-US>sum变量中的static关键字去掉,变量sum卛_Z?span lang=EN-US>autocd的变量,函数卛_Z个可重入的函数?span lang=EN-US>
当然Q有些时候,在函C是必要使用static变量的,比如当某函数的返回gؓ(f)指针cdӞ则必Lstatic的局部变量的地址作ؓ(f)q回|若ؓ(f)autocdQ则q回为错指针?/span>
发表旉Q?/span> 2003-6-13 18:53:48 来源Q中国电(sh)脑教育报 作者:(x)双木 点击 1 ?/span>
?/span> 我们学习(fn)q什么是 “ 数据?/span> ” 。理解数据包Q对于网l管理的|络安全h臛_重要的意义。比如,防火墙的作用本质是(g)网l中的数据包Q判断其是否q反?jin)预先设|的规则Q如果违反就加以L。图 1 是瑞星个h版防火墙软g讄规则的界面。细?j)的读者会(x)发现Q图 1 中的 “ 协议 ” 栏中?/span> “TCP” ?/span> “UDP” {名词,它们是什么意思呢Q现在我们就来讲讲什么是 TCP ?/span> UDP ?/span>
面向q接?/span> TCP
“ 面向q接 ” 是在正式通信前必要与对方徏立vq接。比如你l别人打?sh)话Q必ȝU\接通了(jin)、对Ҏ(gu)赯{才能相互通话?/span>
?span lang=EN-US>1
TCP Q?span lang=EN-US>Transmission Control ProtocolQ传输控制协议)(j)是基于连接的协议Q也是_(d)在正式收发数据前Q必dҎ(gu)建立可靠的连接。一?span lang=EN-US>TCPq接必须要经q三?span lang=EN-US>“对话”才能建立hQ其中的q程非常复杂Q我们这里只做简单、Ş象的介绍Q你只要做到能够理解q个q程卛_。我们来看看q三ơ对话的单过E:(x)LA向主?span lang=EN-US>B发出q接h数据包:(x)“我想l你发数据,可以吗?”Q这是第一ơ对话;LB向主?span lang=EN-US>A发送同意连接和要求同步Q同步就是两CZ个在发送,一个在接收Q协调工作)(j)的数据包Q?span lang=EN-US>“可以Q你什么时候发Q?span lang=EN-US>”Q这是第二次对话Q主?span lang=EN-US>A再发Z个数据包认LB的要求同步:(x)“我现在就发,你接着吧!”Q这是第三次对话。三?span lang=EN-US>“对话”的目的是使数据包的发送和接收同步Q经q三?span lang=EN-US>“对话”之后Q主?span lang=EN-US>A才向LB正式发送数据?span lang=EN-US>
TCP 协议能ؓ(f)应用E序提供可靠的通信q接Q一台计机发出的字节流无差错地发往|络上的其他计算机,对可靠性要求高的数据通信pȝ往往使用TCP协议传输数据?span lang=EN-US>
?span lang=EN-US>2
我们来做一个实验,用计机AQ安?span lang=EN-US>Windows 2000 Server操作pȝQ从“|上d”上的一台计机B拯大小?span lang=EN-US>8,644,608字节的文Ӟ通过状态栏右下角网卡的发送和接收指标׃(x)发现Q虽然是数据是p机B向计算?span lang=EN-US>AQ但是计机A仍发送了(jin)3,456个数据包Q如?span lang=EN-US>2所C。这些数据包是怎样产生的呢Q因为文件传输时使用?span lang=EN-US>TCP/IP协议Q更切地说是用了(jin)面向q接?span lang=EN-US>TCP协议Q计机A接收数据包的时候,要向计算?span lang=EN-US>B回发数据包,所以也产生?jin)一些通信量?span lang=EN-US>
?span lang=EN-US>3
如果事先用网l监视器监视|络量Q就?x)发现由此生的数据量?span lang=EN-US>9,478,819字节Q比文g大小多出10.96%Q如?span lang=EN-US>3所C)(j)Q原因不仅在于数据包和本n占用?jin)一些空_(d)而且也在?span lang=EN-US>TCP协议面向q接的特性导致了(jin)一些额外的通信量的产生?/font>
面向非连接的UDP协议
“ 面向非连?span lang=EN-US>”是在正式通信前不必与Ҏ(gu)先徏立连接,不管Ҏ(gu)状态就直接发送。这与现在风行的手机短信非常怼Q你在发短信的时候,只需要输入对Ҏ(gu)机号?span lang=EN-US>OK?jin)?/font>
UDP Q?span lang=EN-US>User Data ProtocolQ用h据报协议Q是?span lang=EN-US>TCP相对应的协议。它是面向非q接的协议,它不与对方徏立连接,而是直接把数据包发送过去!
?span lang=EN-US>4
UDP 适用于一ơ只传送少量数据、对可靠性要求不高的应用环境。比如,我们l常使用“ping”命o(h)来测试两CZ?span lang=EN-US>TCP/IP通信是否正常Q其?span lang=EN-US>“ping”命o(h)的原理就是向Ҏ(gu)L发?span lang=EN-US>UDP数据包,然后Ҏ(gu)L认收到数据包,如果数据包是否到辄消息?qing)时反馈回来Q那么网l就是通的。例如,在默认状态下Q一?span lang=EN-US>“ping”操作发?span lang=EN-US>4个数据包Q如?span lang=EN-US>2所C)(j)。大家可以看刎ͼ发送的数据包数量是4包,收到的也?span lang=EN-US>4包(因ؓ(f)Ҏ(gu)L收到后会(x)发回一个确认收到的数据包)(j)。这充分说明?span lang=EN-US>UDP协议是面向非q接的协议,没有建立q接的过E。正因ؓ(f)UDP协议没有q接的过E,所以它的通信效果高;但也正因为如此,它的可靠性不?span lang=EN-US>TCP协议高?span lang=EN-US>QQ׃?span lang=EN-US>UDP发消息,因此有时?x)出现收不到消息的情c(din)?/font>
附表Q?span lang=EN-US>tcp协议?span lang=EN-US>udp协议的差?/strong>
TCP 协议?span lang=EN-US>UDP协议各有所ѝ各有所短,适用于不同要求的通信环境?span lang=EN-US>TCP协议?span lang=EN-US>UDP协议之间的差别如附表所C?span lang=EN-US>