UDP中recvfrom函数与sendto函数分析
一.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函数分析相关推荐
- 从send函数和sendto函数参数的不同看TCP和UDP的差别
ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const v ...
- 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 ...
- c语言 socket send,C语言中send()函数和sendto()函数的使用方法
C语言send()函数:经socket传送数据头文件: #include #include 定义函数: int send(int s, const void * msg, int len, unsig ...
- socket网络编程-socket()、bind()、setsockopt()、recvfrom()、sendto()函数
socket()函数 socket()函数的原型如下,这个函数建立一个协议族为domain.协议类型为type.协议编号为protocol的套接字文件描述符.如果函数调用成功,会返回一个标识这个套 ...
- linux内核sock_sendmsg,为什么linux中sendto函数中的msg.msg_iovlen=1;
为什么linux中sendto函数中的msg.msg_iovlen=1; | 内核中定义的sys_sendto的源码吗? 这个属于sendmsg中struct msghdr的用法问题, sys_sen ...
- 测试socket udp 单次传输数据上限(sendto()函数data不能超过65507字节。udp头占8字节,ip头占20字节,加起来正好65535字节)
网传udp传输单次sendto()数据需小于64kb,即65536个字节? 于是我想实测一番 发送端 测试结果: 单次传输65507字节正常: 超过65507字节报错: 接收端 接收端只要大于等于发送 ...
- c++中recvfrom函数_通俗易懂:快速理解网络编程中5种IO模型
关于IO模型,就必须先谈到几个日常接触的几个与IO相关名字:同步,异步,阻塞,非阻塞. 名词解释 同步 如果事件A需要等待事件B的完成才能完成,这种串行执行机制可以说是同步的,这是一种可靠的任务序列, ...
- python中sorted函数的作用_Python中排序方法sort、函数sorted的key参数的作用分析
从Python2.4开始,list.sort方法 和 sorted方法 都增加了一个 'key' 参数用来在进行比较之前指定每个列表元素上要调用的函数,将函数的返回值作为比较的依据. 那么怎么使用这个 ...
- r语言找不到cochrane函数_网状meta必备技能之6-利用R中的meta包实现meta分析
我们仅仅是代码的编辑者.整合者.搬运工,仅免费传授方法,下文数据和代码取自于网络和免费软件"R语言说明书",如果您觉得我们侵犯了您的版权,请通知我们撤稿.请大家谅解,谢谢! 相信大 ...
- 在 ClickHouse 中使用函数实现有序漏斗分析
文章目录 背景 基础 提出问题 分析问题 解决问题 总结 背景 最近大数据项目中,碰到了个问题,在做漏斗分析时分析性能常常跟不上,22 亿数据量往往需要 10s 以上才能返回想要的结果.推测应该是分析 ...
最新文章
- SpringBoot 启动错误搜集
- PlayMaker GUI跟随布局的使用
- 布局文件中fill_parent、match_parent和wrap_content有什么区别?
- html图片墙 无限滚动,尝试用CSS3实现无限循环的无缝滚动
- mysql核心数据库_从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程...
- XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager,
- 震惊世界的亚洲8大奇迹,你都知道几个?
- 肖仰华 | 基于知识图谱的可解释人工智能:机遇与挑战
- secure连不上远程地址_[笔记]Mariadb安装并配置远程访问
- c语言用字符串统计一个整数中数字的个数_全国计算机等级考试二级C语言
- 六级词汇打卡第五天(五)
- 端口渗透·网站渗透过程 --21 ,22,873,3306,6379,8080(8080端口是针对CMS的渗透)...
- 怎么在安卓布局里设置滚动字体_手机里堪称神器的 App
- 新浪微博王传鹏:微博推荐架构的演进
- 依赖注入应该慎用,测试可用测试框架帮忙
- iOS开发-使用dSYM文件符号化Crash日志
- 理解计算机(一)计算机中的抽象概念
- uc看视频显示服务器有点忙,uc浏览器常见问题集锦(一)
- Android 音视频开发之基础篇 使用 imageview绘制一张图片
- 好看的皮囊千篇一律,有趣的Linux命令这里有几打!!!
热门文章
- 通过eslint统一前端IDE的编码风格,避免git冲突
- 【汉化】使用gettext和poedit对xibo-mo文件进行汉化编辑
- EMC信号完整性落地实测1---走出玄学
- 最近发现的一个c# winform的一个很好用很强大的excel控件 reogrid控件
- (若依)RuoYi后台管理框架前端
- 20220117 matlab 全局变量调试
- 服务器虚拟机迁移的过程和步骤是什么,虚拟机迁移的详细步骤(新手如何做好虚拟机迁移)...
- 前端实现调取摄像头实现人脸识别
- matlab 加权回归估计_Matlab:地理加权回归基本操作
- 阿里安全SQL注入检测 前五名队伍分享