网络编程1之send、recv函数详解
头文件:
#include <sys/socket.h>
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);
recv 和send的前3个参数等同于read和write。
send函数:将数据发送到内核发送缓冲区中。
1、如果send检查到要发送的字节数大于发送缓冲区的长度直接返回SOCKET_ERROR.
2、内核缓冲区剩余空间>发送字节数,如果此时内核缓冲区正在发送数据则等待发完,再继续发送;如果发送缓冲区没有正在发送数据,则直接发送。
3、内核缓冲区剩余空间<发送字节数,则send阻塞等待内核发送缓冲区的数据发送完,再发送当前字节。
4、send函数即使将数据成功送进发送缓冲区,单不代表能够成功将数据发送出去,如果此时数据还没发送,网络断掉,那么下一个send直接返回SOCKET_ERROR.与此同时,数据保留。
5、send函数发现发送缓冲区的数据正在发送,那么它会在此等待数据传完,如果数据还没传完,网络中断,send立刻返回SOCKET_ERROR。为什么send会立刻返回SOCKET_ERROR,那是因为UNIX系统一旦发现网络断开,会向调用send的进程发送信号SIGPIPE,即终止进程。
send函数返回值:如果send函数copy成功,返回copy进去的实际字节数。
recv函数:将数据接收到内核的接收缓冲区。其特点:先关心发送缓冲区是否有数据发送。
1、如果调用recv函数的此时此刻,发现发送缓冲区正在传送数据,则等待发送缓冲区发完,如果发送过程中网络断开,recv函数直接返回SOCKET_ERROR.
2、如果调用recv函数的此时此刻,发送缓冲区已经发完,网络也正常。recv会先检查socket的接收缓冲区没有数据或者协议正在接收数据,那么recv就一直等待,直到把数据接收完毕。接收缓冲区将数据接收完后,将数据copy到指定的buff中,如果buff的长度小于接收缓冲区接收的数据长度,那么需要多次recv数据。
recv函数返回值:返回接收之后copy到buff的字节数。因此,一次recv返回不一定能够将接收缓冲区的数据全部copy出来。
网络编程1之send、recv函数详解相关推荐
- send(),recv()函数详解
1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...
- linux内核中send与recv函数详解
Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...
- linux send与recv函数详解
linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...
- linux Socket send与recv函数详解
转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解 1 #include &l ...
- linux socket send函数和recv函数详解以及修改缓冲区大小
一.send/recv详解 1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程 ...
- Java网络编程(6)NIO - Channel详解
前言 NIO的三个核心组件:Buffer.Channel.Selector Java网络编程(4)NIO的理解与NIO的三个组件完成了大概的了解 Java网络编程(5)NIO - Buffer详解详细 ...
- 【Socket网络编程】17. recv() 函数详解
recv函数 int recv( SOCKET s, char *buf, int len, int flags); 参数说明 第一个参数指定接收端套接字描述符: 第二个参数指明一个缓冲区,该缓冲区用 ...
- socket编程---send函数recv函数详解
一.send函数 函数原型:int send( SOCKET s,char *buf,int len,int flags ); 功能:不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端 ...
- Socket send函数和recv函数详解
1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...
- Socket中send()函数和recv()函数详解
目录 1.send函数 2.recv函数 关于socket的send和recv的超时设置 1.send函数 int send( SOCKET s, const char FAR *buf, int l ...
最新文章
- js回调与异步加载的用法
- 人群分析--ResnetCrowd: A Residual Deep Learning Architecture
- MATLAB数学计算与工程分析范例教程,MATLAB数学计算与工程分析范例教程
- java使用ajax异步刷新_Jquery的Ajax实现异步刷新
- SPOJ-OPTM Optimal Marks ★★(按位建图 最小割)
- SpringCloud微服务:阿里开源组件Nacos,服务和配置管理
- jQuery formValidator 表单校验插件4.1.1高仿网易邮箱注册页面(已发演示链接)
- docker springboot读取配置文件_Docker从入门到掉坑(三):容器太多,操作好麻烦
- 获取css selector,selenium的css selector元素获取方式
- 22. DOM 简介
- 阵列matlab程序,阵列信号处理的理论和应用 原书matlab 程序.rar
- 如何将html转换成url,HTML URL
- TIA博途中如何设置不需要初始化DB块也可以下载?
- Mob研究院 · BAT数据洞察报告
- Android Camera高级特性——手动对焦
- 使用前端js代码开发了一个图片转ico图标的功能
- Android 工作记录1 有关界面和快捷操作的
- 二阶常系数线性微分方程的解法
- 五大创新技术成就秦淮“绿色翘楚”
- 跑分软件测试原理,各大跑分软件测试骁龙710和麒麟710的性能,结果你绝对想不到...