一、格式

  • 这两个函数一般适用于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函数)相关推荐

  1. Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)

    对比 进程 线程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 ...

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

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

  3. 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 ...

  4. 2-3:套接字(Socket)编程之UDP通信,sockaddr,sockaddr_in,recvfrom,sendto

    文章目录 一:回顾 二:彻底了解套接字和struct socket结构 (1)一切皆文件-文件描述符-套接字描述符 (2)struct socket结构 A:struct socket结构体作用 B: ...

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

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

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

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

  7. 【Linux网络编程】UDP 套接字编程

    [Linux网络编程]UDP 套接字编程 [1]用户数据报协议(UDP) UDP是一个简单的传输层协议,不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数 ...

  8. C语言网络编程:UDP通信实现

    文章目录 UDP的特点: UDP的用途 UDP编程模型 UDP通信代码实现 UDP的特点: udp 协议是一种无链接的不可靠传输协议,且UDP每次发送到分组数据大小都是固定的,它的主要特点如下: 不建 ...

  9. 【Linux网络编程】UDP编程

    00. 目录 文章目录 00. 目录 01. 概述 02. UDP编程C/S结构 03. UDP常用函数 3.1 sendto函数 3.2 recvfrom函数 3.3 bind函数 04. 程序示例 ...

  10. Linux网络编程 之 UDP编程(六)

    目录 1. UDP客户端     核心函数     完整的UDP客户端程序 2. UDP服务端     核心函数     完整的UDP客户端程序 3. 总结 1. UDP客户端 核心函数 ssize_ ...

最新文章

  1. as3 中get和set的用法
  2. 标称变量(Categorical Features)或者分类变量(Categorical Features​​​​​​​)编码为数值变量(Continuous Features​​​​​​​)
  3. python中strip(),lstrip(),rstrip()函数的讲解
  4. fiddler网络代理原理图_Fiddler–HTTP代理神器
  5. P5355-[Ynoi2017]由乃的玉米田【莫队,bitset,根号分治】
  6. C语言性能优化书籍,Android应用性能优化 (埃尔韦) 中文PDF扫描版
  7. 用windows开发ios app_开发一个APP至少需要多少人|安卓|ios|产品经理
  8. php怎么求最小公倍数,最小公倍数算法
  9. 简单方法:将iso镜像文件压缩包转化为直接可用的光盘映像文件
  10. 网管服务器系统巡检报告,网络设备巡检报告-20210730125215.docx-原创力文档
  11. 谁说大象不能跳舞——《读书笔记》
  12. linux c 获取文件大小
  13. 第一节:(2)逻辑芯片工艺特性指标
  14. 农业借助拼多多的东风实现数字化-纽黑文教育
  15. 【机器学习实战系列】读书笔记之DecisionTree(ID3算法)(三)
  16. 如何在新环境接手项目?(上)【洞见2】
  17. 【Android】设计和实现一个BMI计算程序
  18. Python 编程精选
  19. python猪代码_猪圈密码python脚本实现
  20. 卡巴可以用的激活工具分享大家需要的拿去

热门文章

  1. 传奇服务器二级密保信息存档,找回玩家账号和二级密码,修改密码和密保
  2. 微服务网关选型,请收下我的膝盖!
  3. python爬虫微信公众号视频
  4. springcloud实战一:搭建springboot
  5. linux虚拟机安装教程
  6. 单例模式详解(线程安全,饿汉,懒汉模式)
  7. matlab:使用全局变量
  8. 【3dmax千千问】初学3dmax插件神器第17课|VRAY渲染教程|哪三种表现方式最能影响3dmax疯狂模渲大师设计效果图的写实程度?食住玩3dmax入门到精通进阶教程
  9. EXCEL柱状图制作(三)
  10. 关于子网的网络地址和广播地址的计算问题的方法