linux send与recv函数详解

1 #include <sys/socket.h>
2 ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);
3 ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);

recv 和send的前3个参数等同于read和write。

flags参数值为0或:

 
flags 说明 recv send
 MSG_DONTROUTE 绕过路由表查找      •
 MSG_DONTWAIT 仅本操作非阻塞    •       •
 MSG_OOB     发送或接收带外数据   •   •
 MSG_PEEK   窥看外来消息   •  
 MSG_WAITALL   等待所有数据    •  

1. 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先等待s的发送缓冲区的数据被协议传送完毕,如果协议在传送sock的发送缓冲区中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR

2) 如果套接字sockfd的发送缓冲区中没有数据或者数据被协议成功发送完毕后,recv先检查套接字sockfd的接收缓冲区,如果sockfd的接收缓冲区中没有数据或者协议正在接收数据,那么recv就一起等待,直到把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲区中的数据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函数详解相关推荐

  1. linux内核中send与recv函数详解

    Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...

  2. linux Socket send与recv函数详解

    转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解 1 #include &l ...

  3. linux socket send函数和recv函数详解以及修改缓冲区大小

    一.send/recv详解 1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程 ...

  4. Socket中send()函数和recv()函数详解

    目录 1.send函数 2.recv函数 关于socket的send和recv的超时设置 1.send函数 int send( SOCKET s, const char FAR *buf, int l ...

  5. send(),recv()函数详解

    1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...

  6. Socket send函数和recv函数详解

    1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...

  7. socket编程---send函数recv函数详解

    一.send函数 函数原型:int send( SOCKET s,char *buf,int len,int flags ); 功能:不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端 ...

  8. java socket recv_Socket send函数和recv函数详解

    int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据 ...

  9. linux rcu 用法,synchronize_rcu()函数详解

    二.代码详解 定义在:linux/kernel/rcupdate.c 606/** 607 * synchronize_rcu - wait until a grace period has elap ...

最新文章

  1. 把三千行代码重构为15行
  2. java未知对象调用其某个方法_java如何调用一个方法内的对象
  3. jooq 事务_将jOOQ与Spring结合使用:排序和分页
  4. 数据库书籍大师推荐的Oracle数据库相关的书籍,收集汇总。
  5. 前端学习(3076):vue+element今日头条管理-分支的使用
  6. cuda 编译 linux,Linux下安装Tensorflow源码及编译
  7. 外观模式 门面模式 Facade 结构型 设计模式(十三)
  8. cygwin-1.7 离线安装包_.NET Framework所有版本微软官方下载地址
  9. java线程并发库之--线程阻塞队列ArrayBlockingQueue
  10. paip.超实用 360浏览器最近频繁奔溃解决流程.
  11. Thermal_Config_Tool_exe_v1使用
  12. SPSS单因素方差分析
  13. linux7怎么关闭更新,如何让centos7关闭yum自动更新系统
  14. 【电脑讲解】电脑知识入门大全,超详细电脑基础知识讲解
  15. eclipse将安卓项目commit至github本地仓库后,项目bin文件夹下不生成apk且运行报错
  16. acwing 1904 奶牛慢跑
  17. 机器人心灵感应:允许人类远程操作和训练机器人手
  18. Python 学习之 --- 语法部分(变量、标识符、关键字、进制转换、数据类型转换、运算符)
  19. PHY以太网DP83848IVV/NOPB 工业温度、10/100-Mbps 以太网 PHY 收发器,支持 SNI 和 JTAG
  20. java基础 第一章 对象入门

热门文章

  1. 【opencv】17.提取RBG各种颜色c++代码
  2. 【自动驾驶】5. ROS和DDS的区别总结
  3. 目标检测(Object Detection)资料汇总
  4. Android中minSdkVersion、targetSdkVersion、maxSdkVersion的作用
  5. 初学Java Web(8)——过滤器和监听器
  6. Learning hard C#学习笔记 C#简介
  7. Java - 正则表达式的运用(Pattern模式和Matcher匹配)
  8. Hadoop For Windows
  9. 简明python教程 --C++程序员的视角(四):容器类型(字符串、元组、列表、字典)和参考
  10. 【云吞铺子之专家来了】CDN缓存解读和配置策略