设置标准I/O函数缓冲区的主要目的是为了提高性能。但套接字中的缓冲主要是为了实现TCP协议而设立的。例如,TCP传输中丢失数据时将再次传递,而再次发送数据则意味着在某地保存了数据。存在什么地方呢?套接字的输出缓冲中。与之相反,使用标准I/O函数缓冲的主要目的是为了提高性能。

实际上,缓冲并非在所有的情况下都能带来卓越的性能,但需要传输的数据越多,有无缓冲带来的性能差异越大。

缓冲区主要从如下两个方面带来性能提升:

1.传输的数据量
2.数据向输出缓冲移动的次数

比较一个字节的数据发送10次(10个数据包)的情况和累计10个字节发送1次的情况。发送数据时使用的数据包中含有头信息。头信息与数据大小无关,是按照一定格式填入的。即使假设该头信息占用40个字节(实际更大),需要传输的数据量也存在较大差别。

1个字节发送10次: 40 x 10 = 400字节
10个字节发送一次:40 x 1 = 40字节

另外,为了发送数据,向套接字输出缓冲移动数据也会消耗不少时间。但这同样与与移动次数有关。一个字节数据共移动10次花费的时间将近10个字节数据移动1次花费时间的10倍。

补充:

可以使用标准I/O函数收发数据。使用标准I/O函数主要有两个好处:
1.标准I/O函数具有良好的移植性。
2.标准I/O函数可以利用缓冲提高性能。

使用标准I/O函数传输数据时需要经过两个缓冲区。

例如,通过fputs()函数传输字符串“hello”时,首先将数据传递到标准I/O函数的缓冲区。然后数据将移动到套接字输出缓冲,最后将字符串发送到对方主机。

套接字和标准I/O缓冲区的更多相关文章

  1. TCP/IP网络编程之套接字与标准I/O

    标准I/O函数 标准标准I/O函数有两个优点: 标准I/O函数具有良好的移植性 标准I/O函数可以利用缓冲提高性能 关于移植性无需过多解释,不仅是I/O函数,所有标准函数都具有良好的移植性.因为,为了 ...

  2. Python网络编程——修改套接字发送和接收的缓冲区大小

    很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...

  3. c++ 网络编程(七) LINUX下 socket编程 基于套接字的标准I/O函数使用 与 fopen,feof,fgets,fputs函数用法

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614820.html 一.标准I/O 1,什么是标准I/O?其实是指C语言里的文件操作函数,如 ...

  4. Linux Socket 原始套接字编程

    对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发 ...

  5. Linux 套接字与文件描述符

    端口和套接字,用于确定指定主机上的哪个本地进程使用了哪个协议和哪台远程主机上的哪个进程进行了通信.端口和套接字的使用可以基于以下几点: ①为每个应用过程分配一个过程标识符(Process ID),每次 ...

  6. 基本UDP套接字编程

    概述 使用TCP编写的应用程序和使用UDP编写的应用程序之间存在一些本质差异,其原因在于这两个传输层之间的差别:UDP是无连接不可靠的数据报协议,非常不同于TCP提供的面向连接的可靠字节流.然而相比T ...

  7. 通用套接字选项和TCP套接字选项

    1. 套接字选项函数原型: #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void ...

  8. socket - Linux 套接字

    总览 #include <sys/socket.h> mysocket = socket(int socket_family, int socket_type, int protocol) ...

  9. Linux网络编程:原始套接字简介

    Linux网络编程:原始套接字编程 一.原始套接字用途 通常情况下程序员接所接触到的套接字(Socket)为两类: 流式套接字(SOCK_STREAM):一种面向连接的Socket,针对于面向连接的T ...

随机推荐

  1. 深入理解java集合框架之---------Arraylist集合

    ArrayList简介 ArrayLIst是动态数组,用MSDN的说法就是Array的复杂版本,它提供了动态的增加和减少元素,实现了Collection和List接口,可以灵活的设置数组的大小,要注意 ...

  2. git基本操作若干

    开发合并分支,推送到远程1. git diff 查看修改内容: . git add -A 添加所有修改: . git commit -am "给人的提示"; 提交修改内容 . gi ...

  3. 我与ARM的那些事儿2JINLK烧录nor flash

    前言 最近在研究mini2440的友善之臂,但是我拿着的是实验室早期买的开发板,在做裸机开发的过程中老是不能很好地使用最新版的minitools进行烧录,因而各种不爽,因为生成了bin文件不能很好地传 ...

  4. Mysql查询今天、昨天、7天、近30天、本月、上一月数据

    今天 SELECT * FROM 表名 WHERE TO_DAYS(时间字段名) = TO_DAYS(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  5. PHP OOP面向对象部分方法归总(代码实例子)

    <?php//对象名存在栈内存中,数据存在堆内存中class leyangjun{    var $name;  //定义变量    var $age;    var $sex;         ...

  6. Tomcat源码分析——server.xml文件的加载

    前言 作为Java程序员,对于tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载的进行分析. 源码分析 Bootstrap的 ...

  7. windows 10安装gensim、nltk

    一.安装gensim 1.什么事gensim gensim是一个python的科学库,gensim包含了TF-IDF.随机投影.word2vec和document2vec算法的实现,分层Dirchle ...

  8. Java 防SQL注入过滤器(拦截器)代码

    原文出自:https://blog.csdn.net/seesun2012 前言 浅谈SQL注入:        所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符 ...

  9. IntelliJ使用指南—— 导入Eclipse的Web项目

    通常一个团队中可能有人用eclipse,有人用intelliJ,那么经常会出现需要导入别人用eclipse建好的web项目.而IntelliJ提供了多种项目类型的导入方式,其中就有eclipse. 在 ...

  10. HTML基础-常用标签及图片

    标记/标签{元素} 双标签: <标签>内容</标签> <html></html>    网页 页面的根元素 <head></head& ...