UDP的系统缓存队列---读取

 UDP的系统缓存队列与TCP的相比,有两点显著的不同:

1、UDP没有SendQ。UDP的数据包不会被处理,通过调用sendto()(或者在connect()之后也可以调用send())将数据直接发送。
2、 UDP的数据在缓存队列中是有边缘保证的,也就是说,数据包是有大小的。每次调用recvfrom()(或者在connect()之后调用recv())都会试图接收一个完整的数据包——因此,UDP程序所指定的接收缓存大小应该足够存放每一个UDP数据包,否则,多余的部分就会被抛弃,并且 recvfrom()(或recv())返回一个异常(-1,并且抛出异常代码)。


(在上图中,我们用虚线的数据包边缘表示TCP中的无边缘保证;而UDP中字节之间用虚线隔开表示UDP的数据不会以字节为单位进行传输)

此外,UDP的RecvQ还可能存在于TCP的第三个不同:我们说,UCP是无连接的,当然,我们也可以调用connect()将UDP连接起来,但是在默认无连接的情况下,UDP的RecvQ中可以缓存来自所有远程地址的数据包——这不仅仅在很多时候很不方便,如果我们只希望接收一个特定地址的数据,比如作为客户端只希望接收来自服务器的数据;而且,因为这个缓存可以被任何信息进入,从而也是一个安全隐患,很可能这个缓存在短时间内就会被垃圾信息所填满。
因此,很多时候我们也会用到“有连接”的UDP。
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值