套接字和标准I/O缓冲区
设置标准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缓冲区的更多相关文章
- TCP/IP网络编程之套接字与标准I/O
标准I/O函数 标准标准I/O函数有两个优点: 标准I/O函数具有良好的移植性 标准I/O函数可以利用缓冲提高性能 关于移植性无需过多解释,不仅是I/O函数,所有标准函数都具有良好的移植性.因为,为了 ...
- Python网络编程——修改套接字发送和接收的缓冲区大小
很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...
- c++ 网络编程(七) LINUX下 socket编程 基于套接字的标准I/O函数使用 与 fopen,feof,fgets,fputs函数用法
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614820.html 一.标准I/O 1,什么是标准I/O?其实是指C语言里的文件操作函数,如 ...
- Linux Socket 原始套接字编程
对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发 ...
- Linux 套接字与文件描述符
端口和套接字,用于确定指定主机上的哪个本地进程使用了哪个协议和哪台远程主机上的哪个进程进行了通信.端口和套接字的使用可以基于以下几点: ①为每个应用过程分配一个过程标识符(Process ID),每次 ...
- 基本UDP套接字编程
概述 使用TCP编写的应用程序和使用UDP编写的应用程序之间存在一些本质差异,其原因在于这两个传输层之间的差别:UDP是无连接不可靠的数据报协议,非常不同于TCP提供的面向连接的可靠字节流.然而相比T ...
- 通用套接字选项和TCP套接字选项
1. 套接字选项函数原型: #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void ...
- socket - Linux 套接字
总览 #include <sys/socket.h> mysocket = socket(int socket_family, int socket_type, int protocol) ...
- Linux网络编程:原始套接字简介
Linux网络编程:原始套接字编程 一.原始套接字用途 通常情况下程序员接所接触到的套接字(Socket)为两类: 流式套接字(SOCK_STREAM):一种面向连接的Socket,针对于面向连接的T ...
随机推荐
- JavaScript设计模式-9.工厂模式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- HaspMap的新奇用法
HashMap<String, String> map = new HashMap<String,String>(){ private static final long se ...
- uvm_config_db在UVM验证环境中的应用
如何在有效的使用uvm_config_db来搭建uvm验证环境对于许多验证团队来说仍然是一个挑战.一些验证团队完全避免使用它,这样就不能够有效利用它带来的好处:另一些验证团队却过多的使用它,这让验证环 ...
- Angular: 使用 RxJS Observables 来实现简易版的无限滚动加载指令
我使用 angular-cli 来搭建项目. ng new infinite-scroller-poc --style=scss 项目生成好后,进入 infinite-scroller-poc 目录下 ...
- [MVC]多文件、超大文件上传
话不多说,上代码. <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script> & ...
- C#获取Url不同路径的方法大全
在 C# 中,用 Request 对象来获取 Url 的各种路径,包括上一页 Url.域名.绝对路径.相对路径和物理路径.虽然在某些情况下,无法获取到 Url,但可以获取到大部分情况下的 Url,下 ...
- 面向对象(基础oop)之进入继承
大家好,我叫李京阳,,很高兴认识大家,之所以我想开一个自己的博客,就是来把自己所了解的知识点通过自己的话写一下,希望被博客园的朋友们点评和一起讨论一下,也希望从博客园中多认识一些软件开发人员!现在我开 ...
- 四、spark集群架构
spark集群架构官方文档:http://spark.apache.org/docs/latest/cluster-overview.html 集群架构 我们先看这张图 这张图把spark架构拆分成了 ...
- Spring Boot学习笔记(二)全局捕获异常处理
非常简单只需要创建自己的异常处理类,加上两个注解,就可以了
- poj 2002 Squares 几何二分 || 哈希
Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 15137 Accepted: 5749 Descript ...