本节书摘来自异步社区《UNIX网络编程 卷1:套接字联网API(第3版)》一书中的第8章,第8.2节,作者:【美】W. Richard Stevens , Bill Fenner , Andrew M. Rudoff著,更多章节内容可以访问云栖社区“异步社区”公众号查看

8.2 recvfrom和sendto函数

这两个函数类似于标准的read和write函数,不过需要三个额外的参数。

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

前三个参数sockfd、buff和nbytes等同于read和write函数的三个参数:描述符、指向读入或写出缓冲区的指针和读写字节数。

flags参数将在第14章中讨论recv、send、recvmsg和sendmsg等函数时再介绍,本章中重写简单的UDP回射客户/服务器程序用不着它们。时下我们总是把flags置为0。

sendto的to参数指向一个含有数据报接收者的协议地址(例如IP地址及端口号)的套接字地址结构,其大小由addrlen参数指定。recvfrom的from参数指向一个将由该函数在返回时填写数据报发送者的协议地址的套接字地址结构,而在该套接字地址结构中填写的字节数则放在addrlen参数所指的整数中返回给调用者。注意,sendto的最后一个参数是一个整数值,而recvfrom的最后一个参数是一个指向整数值的指针(即值-结果参数)。

recvfrom的最后两个参数类似于accept的最后两个参数:返回时其中套接字地址结构的内容告诉我们是谁发送了数据报(UDP情况下)或是谁发起了连接(TCP情况下)。sendto的最后两个参数类似于connect的最后两个参数:调用时其中套接字地址结构被我们填入数据报将发往(UDP情况下)或与之建立连接(TCP情况下)的协议地址。

这两个函数都把所读写数据的长度作为函数返回值。在recvfrom使用数据报协议的典型用途中,返回值就是所接收数据报中的用户数据量。

写一个长度为0的数据报是可行的。在UDP情况下,这会形成一个只包含一个IP首部(对于IPv4通常为20个字节,对于IPv6通常为40个字节)和一个8字节UDP首部而没有数据的IP数据报。这也意味着对于数据报协议,recvfrom返回0值是可接受的:它并不像TCP套接字上read返回0值那样表示对端已关闭连接。既然UDP是无连接的,因此也就没有诸如关闭一个UDP连接之类事情。

如果recvfrom的from参数是一个空指针,那么相应的长度参数(addrlen)也必须是一个空指针,表示我们并不关心数据发送者的协议地址。

recvfrom和sendto都可以用于TCP,尽管通常没有理由这样做。

《UNIX网络编程 卷1:套接字联网API(第3版)》——8.2 recvfrom和sendto函数相关推荐

  1. UNIX网络编程.卷1,套接字联网API(第3版)(中文版)(Stevens经典著作,两位顶级网络编程专家应邀执笔修订)...

    UNIX网络编程.卷1,套接字联网API(第3版)(中文版)(Stevens经典著作,两位顶级网络编程专家应邀执笔修订) 基本信息 原书名: Unix Network Programming, Vol ...

  2. UNIX网络编程——基本TCP套接字编程 【转贴】

    一.基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的 ...

  3. 《UNIX网络编程 卷1:套接字联网API》学习笔记——基本TCP套接字编程

    UNIX网络编程--基本TCP套接字编程 socket 函数 connect 函数 bind 函数 listen 函数 accept 函数 fork 和 exec 函数 并发服务器 close 函数 ...

  4. 《UNIX网络编程 卷1:套接字联网API(第3版)》——第2章 传输层:TCP、UDP和SCTP 2.1概述...

    本节书摘来自异步社区<UNIX网络编程 卷1:套接字联网API(第3版)>一书中的第2章,第2.1节,作者:[美]W. Richard Stevens , Bill Fenner , An ...

  5. 图灵社区 : 图书 : UNIX网络编程 卷1:套接字联网API(英文版•第3版)

    图灵社区 : 图书 : UNIX网络编程 卷1:套接字联网API(英文版•第3版) 图灵社区 : 图书 : UNIX网络编程 卷1:套接字联网API(英文版•第3版) UNIX网络编程 卷1:套接字联 ...

  6. 《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决

    <Unix网络编程卷1-套接字联网API>是本好书. 但是第一个例子不是很好编译. 需要如下步骤: 本人机器CentOS 5.4 1.下载源码 unpv13e解压到任意目录 然后按其rea ...

  7. 《UNIX网络编程 卷2:进程间通信(第2版)》——1.4 名字空间

    本节书摘来自异步社区<UNIX网络编程 卷2:进程间通信(第2版)>一书中的第1章,第1.4节,作者:[美]W. Richard Stevens著,更多章节内容可以访问云栖社区" ...

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

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

  9. 1.UNIX网络编程卷1:源码配置

    本节主要介绍UNIX网络编程卷1(第三版)在Ubuntu16.04的配置问题,并运行一个简单时间获取客户程序. 1.首先下载源文件,链接如下:UNIX Network Programming Sour ...

  10. Linux网络编程:原始套接字的魔力【续】

    如何从链路层直接发送数据帧        本来以为这部分都弄完了,结果有朋友反映说看了半天还是没看到如何从链路层直接发送数据.因为上一篇里面提到的是从链路层"收发"数据,结果只&q ...

最新文章

  1. 加载服务器版本信息,传奇服务器端启动加载错误的解决方法
  2. 为什么数据线easy糟糕
  3. 第九天2017/04/18(4、非虚继承、虚继承的本质 / sizeof)
  4. 查看当前服务器中的所有的topic,创建topic,删除topic,通过shell命令发送消息,通过shell消费消息,查看topic详情,对分区数进行修改
  5. QT学习笔记(一):VS2013 +QT 5.8 运行、编译问题解决
  6. 批量无损删除项目中的代码注释方法
  7. 昔日“宅男最爱”、视频播放器之王破产清算:4.5万元商标拍到950万元
  8. HCIE-RS面试--STP选举原理,状态机和接口角色
  9. 百度人脸识别:最简单的Python调用
  10. angular报错:Maximum call stack size exceeded
  11. 51单片机串行口波特率计算
  12. 推荐12个免费查找文献的学术网站,建议点赞、收藏!
  13. 2、水晶头制作---网管技能
  14. NAACL 2022 | 机器翻译SOTA模型的蒸馏
  15. mongodb中的read concern和write concern
  16. 真·富文本编辑器的演进之路-Span开胃菜
  17. u=q k 的交通流模型图 matlab,交通基础:流量、速度、密度(q/u/k)
  18. 实现原理 扫描枪_条码扫描枪的构成和原理
  19. 《Android Studio应用开发实战详解》——第1章,第1.2节Android系统基础
  20. 4.12 通联支付面试题

热门文章

  1. pandasSeries模块
  2. linux centos7 配置ftp,Linux Centos7配置ftp服务器
  3. java 类修饰符 作用域_java的4种内部类,你真的了解了吗?
  4. wincc几个常用c语言编程软件,WINCC几个常用C语言编程
  5. python爱好者社区公众号历史文章合集_微信公众号历史文章爬取api
  6. php获得表单数值,php 表单数据的获取代码
  7. Druid 在有赞的使用场景及应用实践
  8. 如何养成好的Linux操作习惯
  9. c++ 中引用()的用法和应用实例
  10. Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)