一.UDP客户服务器程序的套接字模型

与tcp服务器相比较的优缺点:

二、函数解析

#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t nbytes,int flags, struct sockaddr *from, socklen_t *addrlen);
ssize_t sendto(int sockfd, const void *buf, size_t nsize, int flags, const struct sockaddr *to, const socklen_t *addrlen);若成功,均返回读或者写的字节数;失败则返回-1 

函数的细节要点分析:

1、recvfrom和sendto的前三个参数与recv和send一模一样。

2、recv中参数from,addrlen都是值-结果参数,from指针指向数据发报者的协议地址的套接字地址结构,而addrlen指针则指向地址结构的字节数返回给调用者(与accept函数的最后俩个参数相似, 返回给调用者,处理完请求后,调用sendto函数)。

3、在recvfrom函数中如果不在乎数据发报者的地址,可必须同时设置from和addrlen参数为NULL。

4、在UDP协议中返回长度为0的数据是可行的。因为在UDP的情况下,他会形成20字节的ip首部(IPv4)和一个8字节的UDP首部而没有数据的IP数据报。所以UDP是无连接。

5、sendto和recvfrom在tcp函数中也是通用的。

三、sendto与recvfrom缓冲分析

send和sendto函数在UDP层没有输出缓冲区,在TCP层有输出缓冲区,recv和recvfrom无论在UDP层还是TCP层都有接收缓冲区。这样看来sendto应该是不会阻塞的。

UDP发送缓冲区和接收缓冲区细节分析:

1、这一次我们展示的套接口发送缓冲区用虚框表示,因为它并不存在。UDP套接口有发送缓冲区大小(SO_SNDBUF修改),不过它仅仅是写到套接口的UDP数据报的大小上限。 如果应用程序写一个大于套接口发送缓冲区大小的数据报,内核将返回一个EMSGSIZE错误。 既然UDP不可靠,他不必保存应用进程的数据拷贝,因此无需真正的发送缓冲区(应用进程的数据在沿协议栈往下传递,以某种形式拷贝到内核缓冲区,然而数据链路层在送出数据之后将丢弃该拷贝)

2、UDP没有MSS(最大分节大小)的概念,如果某个UDP应用程序发送大数据,那么他比TCP应用程序更容易分片。从UDP套接口 write成功返回仅仅表示用户写入的数据报或者所有片段已经加入到数据链路层的输出队列。如果该队列没有足够的空间存放该数据报或者他的某个片段,内核 通常返回给应用进程一个ENOBUFS错误(也有的系统不会返回错误)。

3、TCP和UDP都拥有套接口接收缓冲区。TCP套接口接收缓冲区不可能溢出,因为TCP具有流量控制(窗口).然而对于TCP来说, 当接收到的数据报装不进套接口接收缓冲区时,该数据报就丢弃 。UDP是没有流量控制的:较快的发送端可以很容易淹没较慢的接收端,导致接收端的UDP丢弃数据报。

UDP中recvfrom函数与sendto函数分析相关推荐

  1. 从send函数和sendto函数参数的不同看TCP和UDP的差别

    ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const v ...

  2. socket编程:从send函数和sendto函数参数的不同看TCP和UDP的差别。

    ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const v ...

  3. c语言 socket send,C语言中send()函数和sendto()函数的使用方法

    C语言send()函数:经socket传送数据头文件: #include #include 定义函数: int send(int s, const void * msg, int len, unsig ...

  4. socket网络编程-socket()、bind()、setsockopt()、recvfrom()、sendto()函数

    socket()函数 ​ socket()函数的原型如下,这个函数建立一个协议族为domain.协议类型为type.协议编号为protocol的套接字文件描述符.如果函数调用成功,会返回一个标识这个套 ...

  5. linux内核sock_sendmsg,为什么linux中sendto函数中的msg.msg_iovlen=1;

    为什么linux中sendto函数中的msg.msg_iovlen=1; | 内核中定义的sys_sendto的源码吗? 这个属于sendmsg中struct msghdr的用法问题, sys_sen ...

  6. 测试socket udp 单次传输数据上限(sendto()函数data不能超过65507字节。udp头占8字节,ip头占20字节,加起来正好65535字节)

    网传udp传输单次sendto()数据需小于64kb,即65536个字节? 于是我想实测一番 发送端 测试结果: 单次传输65507字节正常: 超过65507字节报错: 接收端 接收端只要大于等于发送 ...

  7. c++中recvfrom函数_通俗易懂:快速理解网络编程中5种IO模型

    关于IO模型,就必须先谈到几个日常接触的几个与IO相关名字:同步,异步,阻塞,非阻塞. 名词解释 同步 如果事件A需要等待事件B的完成才能完成,这种串行执行机制可以说是同步的,这是一种可靠的任务序列, ...

  8. python中sorted函数的作用_Python中排序方法sort、函数sorted的key参数的作用分析

    从Python2.4开始,list.sort方法 和 sorted方法 都增加了一个 'key' 参数用来在进行比较之前指定每个列表元素上要调用的函数,将函数的返回值作为比较的依据. 那么怎么使用这个 ...

  9. r语言找不到cochrane函数_网状meta必备技能之6-利用R中的meta包实现meta分析

    我们仅仅是代码的编辑者.整合者.搬运工,仅免费传授方法,下文数据和代码取自于网络和免费软件"R语言说明书",如果您觉得我们侵犯了您的版权,请通知我们撤稿.请大家谅解,谢谢! 相信大 ...

  10. 在 ClickHouse 中使用函数实现有序漏斗分析

    文章目录 背景 基础 提出问题 分析问题 解决问题 总结 背景 最近大数据项目中,碰到了个问题,在做漏斗分析时分析性能常常跟不上,22 亿数据量往往需要 10s 以上才能返回想要的结果.推测应该是分析 ...

最新文章

  1. u盘锁电脑_Win10电脑无法识别U盘?这5步操作就能轻松搞定,收藏备用
  2. python前段管理3
  3. 计算机网络技术教材多少钱,计算机网络技术课程标准教材.doc
  4. android 安装应用程序apk安装不了
  5. OGG ORA-1403 NO DATA FOUND
  6. vim中实现javascript代码自动完成功能
  7. python教程七牛云_python-django框架中使用七牛云
  8. STM32工作笔记0099---Pacman常用命令
  9. mysql innodb 间隙锁_Mysql innodb 间隙锁
  10. centos 虚拟机 使用串口_vmware中的centos怎样扩充空间
  11. 支持ipv6路由器有什么优点?路由器应用了哪些技术?
  12. 修心修行“十一字”真言
  13. [整理][VBA]Excel合并表格
  14. 数据治理系列文章:(7)数据安全
  15. linux 安装ElasticSearch 6.x
  16. android 如何保存网页图片格式,求助,如何在安卓app内嵌的H5页面里长按保存图片?...
  17. GO语言特殊常量之iota
  18. php 统计中英混杂word文档字数,wordfrequencycount
  19. linux驱动面试题整理
  20. PT100高精度测温电路 AD623+REF3030(转)

热门文章

  1. cAdvisor资源监控工具入门
  2. stl文件的解析和在线3d打印
  3. php程序的完整路径和文件名,php从完整文件路径中分离文件目录和文件名的方法...
  4. java设计文件查重,【java】查重类的实现
  5. 从0开始,html5零基础入门教程,快来看看!
  6. Arcgis 10.2 软件安装教程
  7. 【CSS】纯CSS实现三级导航(模板)
  8. matlab生成tiff,MATLAB中自定义栅格数据地理坐标并写出数据到tiff文件
  9. HTMLpre代码美化
  10. 湖州南浔张静江:“满堂花醉三千客,一剑霜寒四十州”