查看socket缓冲区数据_什么是socket缓冲区?
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缓冲区?相关推荐
- php socket发数据打印,PHP向socket服务器收发数据的方法
这篇文章主要介绍了PHP向socket服务器收发数据的方法,分析了socket收发数据的方法,并介绍了socket常用函数,需要的朋友可以参考下 本文实例讲述了PHP向socket服务器收发数据的方法 ...
- java socket ftp登录_基于java socket的简单FTP功能实现
实现FTP的一些功能,如上传文件,下载文件,显示目录,改变目录,退出等功能 import java.io.BufferedInputStream; import java.io.BufferedOut ...
- 怎么查看atcoder的数据_多表数据联动查看,怎么做?
最近表姐有些繁忙,这一切的繁忙源于一个复杂的任务,那就是老板安排我核对会员用户购物详情,也就是要对照"会员信息表"核对在线订单商品,数据虽然不多,但是需要一条条的搜索,然后来回切换 ...
- mysql怎么命令查看表的数据_查看MySQL数据库表的命令介绍
如果需要查看MySQL数据库中都有哪些MySQL数据库表,应该如何实现呢?下面就为您介绍查看MySQL数据库表的命令,供您参考. 进入MySQL Command line client下 查看当前使用 ...
- Android中关于Socket通信数据大小,内存缓冲区和数据可靠性的一点调查
关于TCP和UDP Socket通信的区别: 应用场景: UDP传输协议效率高,但不可靠: TCP传输效率低,但可靠. 传输数据大小: UDP传输数据限定在64K以下: TCP传输数据无大小限制,可进 ...
- tcp协议缓冲区溢出_【Socket 网络通信】TCP/IP 简介1
网络应用分为客户端(Client)和服务端(Server)例如我们常用的浏览器,就属于客户端,服务于浏览器的服务端,我们称为Web服务器. 上图是以web为例,客户端和服务端在以太网中的通信过程,其它 ...
- websphere mq 查看队列中是否有数据_全网最全的 “消息队列”
消息队列的使用场景 以下介绍消息队列在实际应用常用的使用场景.异步处理.应用解耦.流量削锋和消息通讯四个场景. 1]异步处理:场景说明:用户注册后,需要发注册邮件和注册短信. 引入消息队列后架构如下: ...
- 网络编程 day03 (linux) UDP 协议的传输 与函数 getsockopt setsockopt sendto(经socket传送数据)recvfrom
1.UDP协议的特点 UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议.在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输. 适用情况: 1.发 ...
- 一文搞懂socket读写数据接口API
对文件的读写操作read和write同样适用于socket.但是socket编程接口提供了专门的几个socket读写数据的接口. UDP数据读写函数 recvfrom(从另一个IP接收数据) ssiz ...
最新文章
- Caffe框架GPU与MLU计算结果不一致请问如何调试?
- 《系统集成项目管理工程师》必背100个知识点-44应急储备和管理储备
- JEECG v3视频陆续更新
- mac电脑查看sublime text安装位置和复制文件路径方法:
- linux查看系统版本_Win8系统查看directx版本的操作方法是什么?
- 负债会让你有多大改变?
- 战胜棋王后,人工智能是否可以颠覆安全?
- c 中html抓取页面图片,【教程】抓取网并提取网页中所需要的信息 之 C#版
- GIS案例练习-----------第九天
- c语言程序设计教程上海交通,C语言程序设计教程 交通学习文学.pdf
- 录屏直播时,只有部分屏幕的解决办法
- pojo和vo的含义
- 天啦噜,游戏音乐制作中有音乐制作人竟然还不够?
- Android SlidingMenu 开源项目使用示例(一)
- Fedora 20 安装
- 如何写好科研论文 (第二章习题 Quiz 2)
- allegro16.3中负片电源和地的操作
- QT计算函数运行时间,精确到ms和us
- UI设计按钮图标素材干货模板
- 验证https证书过期时间
热门文章
- windows安装pygame(python3.6)_当我试图安装PyGameforPython3.6时,Pip不起作用[过时]
- rm linux 复制目录,linux学习(四)复制(cp)移动(mv)删除(rm)查找(find)文件、文件夹操作、软硬链接的区别...
- python3.7和2.7_为两个python版本(2.7和3.7)Windows 10安装pip
- 上传文件实时显示网速怎么实现_担心PC程序吃内存占网速?有了它终于放心了...
- c++ map初始化同时赋值_Golang入门教程——map篇
- idea2019配置gradle详解_Constraint Layout 2.0 用法详解
- cocos2dx实现象棋之运动
- Scrapy-Item Pipeline(项目管道)
- CompletableFuture详解~anyOf
- 博客网站源代码_详解SEO布词以及网站排名优化技巧