Socket 就是发送和接收网络数据,Socket 有发送缓冲也有接收缓冲,这些缓冲区有什么作用?

1、什么是Socket缓冲区?

熟悉 Socket 的读者都知道,Socket 的发送和接收,就是调用 send 和 recv 函数。

实际操作中,我们将要发送的数据 buffer,送给 send 函数,然后 send 就会返回成功或者失败,那么,send 什么时候返回成功呢?是发送到对端函数才返回吗?答案是否定的。(注意:Socket 有同步和异步,本文主要讨论 Socket 缓冲区,不深究异步,都假定是同步)

实际上呢,Socket 有一个缓冲区,send 的数据 buffer,它会先发到缓冲区里面,然后由操作系统去调度发送。所以,send 返回成功,仅仅只是说明,数据放到缓冲区成功了,不代表对端接收了,更不代表对端应用程序正确处理了。所以我们会看到缓冲区不满的时候,send 函数很快就返回了,而缓冲区满的时候,send 函数会阻塞直到超时返回错误。recv 函数同理,实际上是从缓冲区获取数据,发过来的网络数据,系统将会放到缓冲区里面,直到 recv 函数去获取数据,才取出来,并且释放出空间。稍后我们通过实例来看这些缓冲区。

2、如何查看socket的缓冲区?

Linux 下面查看 Socket 的缓冲区情况非常的简单,就是用 netstat -an 命令,它会列出所有的连接的端口,我们看一下实例

这里就指出每个 Active 的连接,主要的元素包括 Proto 协议,上图是 UDP 协议,然后是 RecvQ 和 SendQ,这就是本文讨论的 Socket 缓冲区,一个是接收缓冲,一个是发送缓冲,我们可以实时查看当前的状态。后面是本机 IP 和端口,以及对端的 IP 和端口,最后是连接状态,上图是 UDP 的所有没有状态。

下面我们运行一个 Socket 程序,再看 netstat 状态,来感受一下,

这个时候我们发现,出现了一个 TCP 的连接,是 SYN 状态,SendQ 是 1,因为发送了一个 syn 包到缓冲区,对端一直连接不上(服务端没开启),所以缓冲区一直是 1。若我们开启服务器端,连接会正常,这时候你再观察,会发现 SendQ 变成 0,我们看一下:

这时候连接建立了,缓冲区变成 0 了。

3、网络数据发送和接收与缓冲区的关系

通过以上的分析,我们应该已经大致了解了网络数据发送和接收与缓冲区的关系。

总的来说,不管发送还是接收,都要先经过缓冲区,操作系统将会处理缓冲区里面的数据。以发送为例,应用程序提交到缓冲区,就等着系统来处理了,网络不畅通,系统就发不出去,缓冲就会越积越多;接收也是同样情况,系统接收到数据,放缓冲区里面,通知应用程序来获取,应用程序若不及时处理,缓冲就越积越多。

所以缓冲区的大小多少合适呢?

系统给了一个默认值,但是不见得适合所有情况,高速网络可以调大,低速网络可以调小,这个应用程序可以自行灵活控制。

关注琉忆编程库,一起学编程

查看socket缓冲区数据_什么是socket缓冲区?相关推荐

  1. php socket发数据打印,PHP向socket服务器收发数据的方法

    这篇文章主要介绍了PHP向socket服务器收发数据的方法,分析了socket收发数据的方法,并介绍了socket常用函数,需要的朋友可以参考下 本文实例讲述了PHP向socket服务器收发数据的方法 ...

  2. java socket ftp登录_基于java socket的简单FTP功能实现

    实现FTP的一些功能,如上传文件,下载文件,显示目录,改变目录,退出等功能 import java.io.BufferedInputStream; import java.io.BufferedOut ...

  3. 怎么查看atcoder的数据_多表数据联动查看,怎么做?

    最近表姐有些繁忙,这一切的繁忙源于一个复杂的任务,那就是老板安排我核对会员用户购物详情,也就是要对照"会员信息表"核对在线订单商品,数据虽然不多,但是需要一条条的搜索,然后来回切换 ...

  4. mysql怎么命令查看表的数据_查看MySQL数据库表的命令介绍

    如果需要查看MySQL数据库中都有哪些MySQL数据库表,应该如何实现呢?下面就为您介绍查看MySQL数据库表的命令,供您参考. 进入MySQL Command line client下 查看当前使用 ...

  5. Android中关于Socket通信数据大小,内存缓冲区和数据可靠性的一点调查

    关于TCP和UDP Socket通信的区别: 应用场景: UDP传输协议效率高,但不可靠: TCP传输效率低,但可靠. 传输数据大小: UDP传输数据限定在64K以下: TCP传输数据无大小限制,可进 ...

  6. tcp协议缓冲区溢出_【Socket 网络通信】TCP/IP 简介1

    网络应用分为客户端(Client)和服务端(Server)例如我们常用的浏览器,就属于客户端,服务于浏览器的服务端,我们称为Web服务器. 上图是以web为例,客户端和服务端在以太网中的通信过程,其它 ...

  7. websphere mq 查看队列中是否有数据_全网最全的 “消息队列”

    消息队列的使用场景 以下介绍消息队列在实际应用常用的使用场景.异步处理.应用解耦.流量削锋和消息通讯四个场景. 1]异步处理:场景说明:用户注册后,需要发注册邮件和注册短信. 引入消息队列后架构如下: ...

  8. 网络编程 day03 (linux) UDP 协议的传输 与函数 getsockopt setsockopt sendto(经socket传送数据)recvfrom

    1.UDP协议的特点 UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议.在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输. 适用情况: 1.发 ...

  9. 一文搞懂socket读写数据接口API

    对文件的读写操作read和write同样适用于socket.但是socket编程接口提供了专门的几个socket读写数据的接口. UDP数据读写函数 recvfrom(从另一个IP接收数据) ssiz ...

最新文章

  1. Caffe框架GPU与MLU计算结果不一致请问如何调试?
  2. 《系统集成项目管理工程师》必背100个知识点-44应急储备和管理储备
  3. JEECG v3视频陆续更新
  4. mac电脑查看sublime text安装位置和复制文件路径方法:
  5. linux查看系统版本_Win8系统查看directx版本的操作方法是什么?
  6. 负债会让你有多大改变?
  7. 战胜棋王后,人工智能是否可以颠覆安全?
  8. c 中html抓取页面图片,【教程】抓取网并提取网页中所需要的信息 之 C#版
  9. GIS案例练习-----------第九天
  10. c语言程序设计教程上海交通,C语言程序设计教程 交通学习文学.pdf
  11. 录屏直播时,只有部分屏幕的解决办法
  12. pojo和vo的含义
  13. 天啦噜,游戏音乐制作中有音乐制作人竟然还不够?
  14. Android SlidingMenu 开源项目使用示例(一)
  15. Fedora 20 安装
  16. 如何写好科研论文 (第二章习题 Quiz 2)
  17. allegro16.3中负片电源和地的操作
  18. QT计算函数运行时间,精确到ms和us
  19. UI设计按钮图标素材干货模板
  20. 验证https证书过期时间

热门文章

  1. windows安装pygame(python3.6)_当我试图安装PyGameforPython3.6时,Pip不起作用[过时]
  2. rm linux 复制目录,linux学习(四)复制(cp)移动(mv)删除(rm)查找(find)文件、文件夹操作、软硬链接的区别...
  3. python3.7和2.7_为两个python版本(2.7和3.7)Windows 10安装pip
  4. 上传文件实时显示网速怎么实现_担心PC程序吃内存占网速?有了它终于放心了...
  5. c++ map初始化同时赋值_Golang入门教程——map篇
  6. idea2019配置gradle详解_Constraint Layout 2.0 用法详解
  7. cocos2dx实现象棋之运动
  8. Scrapy-Item Pipeline(项目管道)
  9. CompletableFuture详解~anyOf
  10. 博客网站源代码_详解SEO布词以及网站排名优化技巧