1.简介
- #include
- ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);
- ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
- send和recv的前3个参数等同于read和write;
- flags参数值为0或:
flags |
说明 |
recv |
send |
MSG_DONTROUTE |
绕过路由表查找 |
|
• |
MSG_DONTWAIT |
仅本操作非阻塞 |
• |
• |
MSG_OOB |
发送或接收带外数据 |
• |
• |
MSG_PEEK |
窥看外来消息 |
• |
|
MSG_WAITALL |
等待所有数据 |
• |
|
2. send解析
- sockfd:指定发送端套接字描述符。
- buff: 存放要发送数据的缓冲区
- nbytes: 实际要改善的数据的字节数
- flags: 一般设置为0
1) send先比较发送数据的长度nbytes和套接字sockfd的发送缓冲区的长度,如果nbytes > 套接字sockfd的发送缓冲区的长度, 该函数返回SOCKET_ERROR。
2) 如果nbtyes <= 套接字sockfd的发送缓冲区的长度,那么send先检查协议是否正在发送sockfd的发送缓冲区中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送sockfd的发送缓冲区中的数据或者sockfd的发送缓冲区中没有数据,那么send就比较sockfd的发送缓冲区的剩余空间和nbytes。
3) 如果 nbytes > 套接字sockfd的发送缓冲区剩余空间的长度,send就一起等待协议把套接字sockfd的发送缓冲区中的数据发送完。
4) 如果 nbytes < 套接字sockfd的发送缓冲区剩余空间大小,send就仅仅把buf中的数据copy到剩余空间里(注意:并不是send把套接字sockfd的发送缓冲区中的数据传到连接的另一端的,而是协议传送的。send仅仅是把buf中的数据copy到套接字sockfd的发送缓冲区的剩余空间里)。
5) 如果send函数copy成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果在等待协议传送数据时网络断开,send函数也返回SOCKET_ERROR。
6) send函数把buff中的数据成功copy到sockfd的发送缓冲区的剩余空间后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个socket函数就会返回SOCKET_ERROR(每一个除send的socket函数在执行的最开始总要先等待套接字的发送缓冲区中的数据被协议传递完毕才能继续,如果在等待时出现网络错误那么该socket函数就返回SOCKET_ERROR)。
7) 在unix系统下,如果send在等待协议传送数据时网络断开,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的处理是进程终止。
2.recv解析
- sockfd: 接收端套接字描述符
- buff: 用来存放recv函数接收到的数据的缓冲区
- nbytes: 指明buff的长度
- flags: 一般置为0
1) recv先等待sockfd的发送缓冲区的数据被协议传送完毕,如果协议在传送sock的发送缓冲区中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR。
2) 如果套接字sockfd的发送缓冲区中没有数据或者数据被协议成功发送完毕后,recv先检查套接字sockfd的接收缓冲区,如果sockfd的接收缓冲区中没有数据或者协议正在接收数据,那么recv就一起等待,直到把数据接收完毕。当协议把数据接收完毕,recv函数就把sockfd的接收缓冲区中的数据copy到buff中(注意:协议接收到的数据可能大于buff的长度,所以在这种情况下要调用几次recv函数才能把sockfd的接收缓冲区中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的)。
3) recv函数返回其实际copy的字节数,如果recv在copy时出错,那么它返回SOCKET_ERROR。如果recv函数在等待协议接收数据时网络中断了,那么它返回0。
4) 在unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用 recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。
关键字:linux内核 send recv 函数详解
引用地址:
linux内核中send与recv函数详解
推荐阅读最新更新时间:2024-03-16 14:45
Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核
在上文《Qemu搭建ARM vexpress开发环境(一)》中已经简单讲述了通过Qemu模拟直接启动Linux内核,并挂在SD卡根文件系统的方法,这种方法是直接启动内核,与实际应用中ARM板的启动方式:u-boot、kernel、rootfs有些不同。现在就来讲述下通过Qemu搭建通过u-boot启动Linux内核并挂载根文件系统的方法。 1. 开发环境简述 嵌入式系统要正常运行,应该包含:u-boot、kernel、rootfs、appfs。这几部分在ARM开发板Flash上的位置关系应该类似于下图所示: BootLoader BootParameters Kernel Rootfs Appfs ro
[单片机]
linux内核中的文件描述符(三)--fd的回收
Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.csdn.net/ce123) 1.close函数 上图说明了close(fd)的执行过程,主要包括两部分:释放文件描述符fd,关闭文件file。 view plain copy print ? //fs/open.c asmlinkage long sys_close(unsigned int fd) { struct file * filp; struct files_struct *files = current- fi
[单片机]
STM32之三标准外设版USB驱动库详解(架构+文件+函数+使用说明
写在前面 目前,ST的USB驱动有两套,一套是早期的独立版USB驱动,官方培训文档中称为Legacy library;一套为针对其Cube 系列的驱动,根据芯片不同可能有区别,具体见对应芯片的Cube驱动包,官方培训文档中称为Cube library。 本文使用的为Legacy library USB 驱动。更详细的各驱动库版本,请参考博文STM32 之 USB IP(USB模块) 详解。 本文多出自于ST的官方文档 及 2016~2017的培训文档,读者也可以直接去ST官网查阅相关文档。 稍有涉及USB 2.0 规范的内容,关于USB规范去官网或自行Google。也可以参考: USB之USB2.0 规范详解 第一部分 USB之U
[单片机]
IIC_Recv如何在IIC静默模式下读取IIC总线数据
//IIC静默模式介绍:做电容式触摸屏的原车屏升级时,需要全程读取IIC的触摸数据,且不能影响IIC总线的数据,如:不能主动查询IIC、不能发送数据、不能发送ACK信号,不能进行地址过滤、不能响应查询信号等。 //IIC静默模式实现难度比较高,需要实时同步IIC_SCL信号,识别IIC_SDA的关键信号start、stop、ack、nack、data域,需要比较精准的延时函数及健壮的代码。 //以下提供的源码即可实现IIC静默模式及IIC主模式读取数据,并转发到串口。 /****************************Copyright (c)************************************
[单片机]
linux内核中的GPIO系统之(2):pin control subsystem
一、前言 在linux2.6内核上工作的嵌入式软件工程师在pin control上都会遇到这样的状况: (1)启动一个新的项目后,需要根据硬件平台的设定进行pin control相关的编码。例如:在bootloader中建立一个大的table,描述各个引脚的配置和缺省状态。此外,由于SOC的引脚是可以复用的,因此在各个具体的driver中,也可能会对引脚进行的配置。这些工作都是比较繁琐的工作,需要极大的耐心和细致度。 (2)发现某个driver不能正常工作,辛辛苦苦debug后发现仅仅是因为其他的driver在初始化的过程中修改了引脚的配置,导致自己的driver无法正常工作 (3)即便是主CPU是一样的项目,但是由于外设的不同,
[单片机]
linux内核中的typeof
内核版本:2.6.14 今天分析内核时又看到了typeof,只知道它大概是返回变量的类型,后来上网查了下发现这个关键字在linux中用的非常多。如果你对sizeof很熟悉的话,那么大可进行类推,sizeof(exp)返回的是exp的数据类型大小,那么typeof(exp.)返回的就是exp的数据类型。下面是linux内核中typeof的一些例子。 include/linux/kernel.h view plain copy print ? /* * min()/max() macros that also do * strict type-checking.. See the * unnecessa
[单片机]
初学24CXX系列EEPROM使用详解&STM32库函数I2C总线
24CXX系列芯片属于EEPROM(Electrically Erasable Programmable read only memory)即电可擦可编程只读存储器,是一种掉电后数据不丢失(不挥发)存储芯片。 24CXX系列芯片数据说明:见下表(只做参考,只表明常用24CXX器件的常用数据,具体使用请查阅器件数据手册): 如24C02BN容量=2KB,但写缓冲区(页容量)=8K 1、“型号”:24Cxx系列型号的标称C后面的参数代表其存储容量大小,单位为KB,这里的1KB=1024bit; 2、“存储容量”:24Cxx系列存储数据为8位(bit)格式,根据其容量可以计算出各型号具体存储数据的字节(Byte)数; 3
[单片机]