send函数工作原理

send函数只负责将数据提交给网络协议层。 当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR; 如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据; 如果是,就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len; 如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小,send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。 如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR; 如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。

要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。 如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回SOCKET_ERROR)

recv函数工作原理:
   recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0 。

对方优雅的关闭socket并不影响本地recv的正常接收数据;如果协议缓冲区内没有数据,recv返回0,指示对方关闭;如果协议缓冲区有数据,则返回对应数据(可能需要多次recv),在最后一次recv时,返回0,指示对方关闭。

关于SOCKET中send和recv函数工作原理总结相关推荐

  1. socket api中send()和recv()函数工作原理与要点

    send()和recv()函数是网络编程中经常使用到的函数,下面详细的比较两者的不同之处 send函数工作原理: send函数只负责将数据提交给协议层. 当调用该函数时,send先比较待发送数据的长度 ...

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

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

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

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

  4. socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)

    socket的阻塞模式和非阻塞模式 无论是Windows还是Linux,默认创建socket都是阻塞模式的 在Linux中,可以再创建socket是直接将它设置为非阻塞模式 int socket (i ...

  5. linux Socket send与recv函数详解

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

  6. linux send与recv函数详解

    linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...

  7. 非阻塞模式下 SEND 和 RECV 函数的返回值总结

    send 和 recv 函数的各种返回值意义: 返回值 n 返回值含义 大于 0 成功发送 n 个字节 0 对端关闭连接 小于 0( -1) 出错或者被信号中断或者对端 TCP 窗口太小数据发不出去( ...

  8. socket之send和recv原理剖析

    socket之send和recv原理剖析 1. 认识TCP socket的发送和接收缓冲区 当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区,这个发送和接收缓冲区指的就是内存 ...

  9. recv函数_第五十二章、send和recv函数

    套接字之间一旦建立了连接,那么就可以传送数据了,上一章我们使用的是标准读写函数read和write,这一章我们再来学习另外两个函数recv和send函数. recv和send函数只能用于套接字,还需要 ...

最新文章

  1. qcustomplot 游标吸附_qcustomplot游标测量功能--Apple的学习笔记
  2. 『全球化产品』应该要避开的几个坑
  3. 《我们应该怎样做需求分析》阅读笔记
  4. ms sql server 添加列,删除列。
  5. 【OS学习笔记】二十 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之主引导扇区程序
  6. 另一个flutter-go
  7. 消灭WinRAR广告
  8. 幻想三国android官方版,幻想三国ol官方版下载
  9. 解析大数据智能分析平台开发
  10. Latex + IEEEtran模板 + 样例 + 数学符号表
  11. Wallpaper Engine壁纸推荐,让程序猿的桌面优美起来
  12. 59.qt quick-qml调色板(颜色取色器)实现、自定义QQuickStyle样式
  13. 关系数据模型、基本概念、关系模型的基本术语、关系代数
  14. sigmoid函数和阶跃函数的Python代码比较 ← 斋藤康毅
  15. Unable to chmod sdcard: Read-only file system
  16. 帧数达不到144用144hz_不看不知道 老司机告诉你60Hz和144Hz的差别
  17. 第三章 模糊查询与分组查询 ② 代码
  18. Emscripten 安装 亲测有效
  19. Python代码实现-主成分分析(PCA)降维及故障诊断中的T2和SPE统计量Matplotlib出图|Python技能树征题
  20. 无线串口服务器设计,基于无线串口服务器的DNC实验系统设计与开发.pdf

热门文章

  1. Redis分布式锁原理解析
  2. 闭包案例产生多个相同的随机数 沙箱
  3. mysql主机咋填_mysql数据库主机填什么
  4. GitLab初次安装后,登录GitLab网页的管理员账号和密码各是什么?
  5. 21.5.8阶段四数据类型
  6. 四种π型RC滤波电路
  7. 共模干扰和差模干扰(图解)---摘自: 硬件十万个为什么
  8. bootstrap-响应式导航条
  9. Dynamics CRM 2013 初体验(1):系统的安装
  10. mysql5.5数据库安装