沈阳正规制作网站公司吗,做网站 搞流量 赚广告费,地推网,wap 网站 开发Socket 就是发送和接收网络数据#xff0c;Socket 有发送缓冲也有接收缓冲#xff0c;这些缓冲区有什么作用#xff1f;1、什么是Socket缓冲区#xff1f;熟悉 Socket 的读者都知道#xff0c;Socket 的发送和接收#xff0c;就是调用 send 和 recv 函数。实际操作中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、网络数据发送和接收与缓冲区的关系通过以上的分析我们应该已经大致了解了网络数据发送和接收与缓冲区的关系。总的来说不管发送还是接收都要先经过缓冲区操作系统将会处理缓冲区里面的数据。以发送为例应用程序提交到缓冲区就等着系统来处理了网络不畅通系统就发不出去缓冲就会越积越多接收也是同样情况系统接收到数据放缓冲区里面通知应用程序来获取应用程序若不及时处理缓冲就越积越多。所以缓冲区的大小多少合适呢系统给了一个默认值但是不见得适合所有情况高速网络可以调大低速网络可以调小这个应用程序可以自行灵活控制。关注琉忆编程库一起学编程