UNP编程:15---UDP之(recvfrom、sendto函数)
一、格式
- 这两个函数一般适用于UDP使用
#include<sys/types.h>
#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 nbytes, int flags, const struct sockaddr *to, socklen_t addrlen);
参数
- 参数1:套接字描述符
- 参数2、3:发送/接收数据的缓冲区指针和读写的字节数
- 参数4:与recv/send/recvmsg/sendmsg函数的相同(见文章:https://blog.csdn.net/qq_41453285/article/details/89810464,https://blog.csdn.net/qq_41453285/article/details/89810683)。不想使用就设置为0
- 参数5、6:发送/接收数据的套接字地址、以及地址大小
recvfrom返回值
- 成功:返回接收到的字节数
- 返回0:
- 当一个流套接字对等节点有序地关闭时,返回值将为0(传统的“end-of-file”标志)
- 不同域(例如UNIX和Internet域)中的数据报套接字允许零长度的数据报。当接收到这样的数据报时,返回值为0。
- 如果要从流套接字接收的请求字节数为0,也可以返回值0
- 失败:返回-1,并将errno设置为如下的值:
- 这些是套接字层生成的一些标准错误。底层协议模块可能会产生和返回其他错误
- EAGAIN或EWOULDBLOCK:套接字标记为非阻塞,接收操作将阻塞,或者设置了接收超时,并且在接收数据之前超时已经过期。在这种情况下,POSIX.1允许返回任何一个错误,并且不要求这些常量具有相同的值,因此可移植应用程序应该检查这两种可能性
- EBADF:参数sockfd是一个无效的文件描述符
- ECONNREFUSED:远程主机拒绝允许网络连接(通常是因为它没有运行所请求的服务)
- EFAULT:将接收缓冲区指针指向进程地址空间之外
- EINTR :在任何数据可用之前,接收被信号的发送打断
- EINVAL:无效参数传递
- ENOMEM:无法为recvmsg()分配内存
- ENOTCONN:套接字与一个面向连接的协议相关联,并且还没有被连接(参阅connect()和accept())
- ENOTSOCK:文件描述符sockfd不引用套接字
sendto返回值
- 成功:返回发送的字节数
- 失败:返回-1,并将errno设置为如下的值:
- 这些是套接字层产生的一些标准错误。底层协议模块可能会产生和返回其他错误
- EACCES:
- 在目标套接字文件上拒绝EACCES(对于UNIX域套接字,它是由路径名标识的)的写权限,或者拒绝路径前缀中的某个目录的搜索权限。(参阅path_resolution())。
- (对于UDP套接字)尝试发送到网络/广播地址,就好像它是一个单播地址
- EAGAIN或EWOULDBLOCK:套接字标记为非阻塞,请求的操作将阻塞。在这种情况下,POSIX.1-2001允许返回任何一个错误,并且不要求这些常量具有相同的值,因此可移植应用程序应该检查这两种可能性
- EAGAIN:sockfd引用的套接字以前没有绑定到一个地址,当尝试将其绑定到临时端口时,确定临时端口范围内的所有端口号目前都在使用。参见ip(7)中的/proc/sys/net/ipv4/ip_local_port_range的讨论
- EALREADY:另一个快速开放正在进行中
- EBADF:sockfd不是一个有效的打开文件描述符
- ECONNRESET:通过对等点重置连接
- EDESTADDRREQ:套接字不是连接模式,没有设置对等地址
- EFAULT:为参数指定了无效的用户空间地址
- EINTR:在任何数据传输之前发生的信号
- EINVAL:无效参数传递
- EISCONN:连接模式套接字已经连接,但是指定了一个接收方。(现在要么返回此错误,要么忽略收件人规范。)
- EMSGSIZE:套接字类型要求以原子方式发送消息,而要发送的消息的大小使得这种情况不可能发生
- ENOBUFS:网络接口的输出队列已满。这通常表示接口已停止发送,但可能是由瞬态拥塞引起的。(通常,这在Linux中不会发生。当设备队列溢出时,数据包会无声地丢弃。)
- ENOMEM:没有可用的内存
- ENOTCONN:套接字没有连接,并且没有给定目标
- ENOTSOCK:文件描述符sockfd不引用套接字
- EOPNOTSUPP:标志参数中的一些位不适合套接字类型
- EPIPE:在一个面向连接的套接字上,本地端已经关闭。在本例中,除非设置了MSG_NOSIGNAL,否则进程还将收到一个SIGPIPE
注意事项
- 最后一个参数recvfrom函数为地址大小指针,sendto函数为地址大小
- 如果recvfrom的from参数是一个空指针,那么相应的长度参数(addrlen)也必须是一个空指针,表示我们并不关心数据发送者的协议地址
二、注意事项
- ①写一个长度为0的数据报是可行的。在UDP情况下,这会形成一个只包含一个IP首部(对于 IPv4通常为20个字节,对于IPv6通常为40个字节)和一个8字节UDP首部而没有数据的IP数据报。 这也意味着对于数据报协议,recvfrom返回0值是可接受的:它并不像TCP套接字上read返回0 值那样表示对端已关闭连接。既然UDP是无连接的,因此也就没有诸如关闭一个UDP连接之类事情
- ②recvfrom和sendto都可以用于TCP,尽管通常没有理由这样做
UNP编程:15---UDP之(recvfrom、sendto函数)相关推荐
- Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)
对比 进程 线程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 ...
- socket网络编程-socket()、bind()、setsockopt()、recvfrom()、sendto()函数
socket()函数 socket()函数的原型如下,这个函数建立一个协议族为domain.协议类型为type.协议编号为protocol的套接字文件描述符.如果函数调用成功,会返回一个标识这个套 ...
- 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 ...
- 2-3:套接字(Socket)编程之UDP通信,sockaddr,sockaddr_in,recvfrom,sendto
文章目录 一:回顾 二:彻底了解套接字和struct socket结构 (1)一切皆文件-文件描述符-套接字描述符 (2)struct socket结构 A:struct socket结构体作用 B: ...
- 测试socket udp 单次传输数据上限(sendto()函数data不能超过65507字节。udp头占8字节,ip头占20字节,加起来正好65535字节)
网传udp传输单次sendto()数据需小于64kb,即65536个字节? 于是我想实测一番 发送端 测试结果: 单次传输65507字节正常: 超过65507字节报错: 接收端 接收端只要大于等于发送 ...
- 从send函数和sendto函数参数的不同看TCP和UDP的差别
ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const v ...
- 【Linux网络编程】UDP 套接字编程
[Linux网络编程]UDP 套接字编程 [1]用户数据报协议(UDP) UDP是一个简单的传输层协议,不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数 ...
- C语言网络编程:UDP通信实现
文章目录 UDP的特点: UDP的用途 UDP编程模型 UDP通信代码实现 UDP的特点: udp 协议是一种无链接的不可靠传输协议,且UDP每次发送到分组数据大小都是固定的,它的主要特点如下: 不建 ...
- 【Linux网络编程】UDP编程
00. 目录 文章目录 00. 目录 01. 概述 02. UDP编程C/S结构 03. UDP常用函数 3.1 sendto函数 3.2 recvfrom函数 3.3 bind函数 04. 程序示例 ...
- Linux网络编程 之 UDP编程(六)
目录 1. UDP客户端 核心函数 完整的UDP客户端程序 2. UDP服务端 核心函数 完整的UDP客户端程序 3. 总结 1. UDP客户端 核心函数 ssize_ ...
最新文章
- as3 中get和set的用法
- 标称变量(Categorical Features)或者分类变量(Categorical Features​​​​​​​)编码为数值变量(Continuous Features​​​​​​​)
- python中strip(),lstrip(),rstrip()函数的讲解
- fiddler网络代理原理图_Fiddler–HTTP代理神器
- P5355-[Ynoi2017]由乃的玉米田【莫队,bitset,根号分治】
- C语言性能优化书籍,Android应用性能优化 (埃尔韦) 中文PDF扫描版
- 用windows开发ios app_开发一个APP至少需要多少人|安卓|ios|产品经理
- php怎么求最小公倍数,最小公倍数算法
- 简单方法:将iso镜像文件压缩包转化为直接可用的光盘映像文件
- 网管服务器系统巡检报告,网络设备巡检报告-20210730125215.docx-原创力文档
- 谁说大象不能跳舞——《读书笔记》
- linux c 获取文件大小
- 第一节:(2)逻辑芯片工艺特性指标
- 农业借助拼多多的东风实现数字化-纽黑文教育
- 【机器学习实战系列】读书笔记之DecisionTree(ID3算法)(三)
- 如何在新环境接手项目?(上)【洞见2】
- 【Android】设计和实现一个BMI计算程序
- Python 编程精选
- python猪代码_猪圈密码python脚本实现
- 卡巴可以用的激活工具分享大家需要的拿去