MySQL协议分析

合集下载

MySQL中的数据流与数据传输方式分析

MySQL中的数据流与数据传输方式分析

MySQL中的数据流与数据传输方式分析导言数据库是现代应用程序中必不可少的一部分。

它负责存储、管理和检索数据,为应用程序提供高效的数据操作支持。

而MySQL作为一种开源关系型数据库管理系统,被广泛应用于各个领域。

在MySQL中,数据的流动和传输是其中一个核心的概念。

本文将对MySQL中的数据流与数据传输方式进行分析,并探讨其在数据库系统中的重要性和影响。

一、MySQL中的数据流数据流是指在数据库系统中,数据从一个位置或一种形式流向另一个位置或另一种形式的过程。

在MySQL中,数据流可以发生在不同的层次和场景中,如从应用程序到数据库服务器、数据库服务器之间的数据交换等。

数据流的方式主要有以下几种:1. 应用程序到数据库服务器在一个典型的应用程序中,数据流从应用程序通过网络连接到数据库服务器。

这个过程中,应用程序将请求数据发送给数据库服务器,数据库服务器处理请求,并将处理结果返回给应用程序。

这种数据流一般是通过数据库的客户端连接实现的。

2. 数据库服务器之间在大型的分布式数据库系统中,数据流可能还会发生在不同的数据库服务器之间。

这种数据流一般是通过数据库复制、分片技术等实现的。

例如,在一个分布式数据库中,当一个数据库服务器接收到数据更新操作时,它会将该更新操作广播给其他的数据库服务器,以保证数据的一致性。

3. 数据库服务器到存储设备在MySQL中,数据流还可以发生在数据库服务器和存储设备之间。

当数据库服务器读取或写入数据时,它会通过存储设备实现数据的输入和输出。

这种数据流的效率和性能对于数据库的高速运行至关重要。

二、MySQL中的数据传输方式数据传输方式是指在MySQL中,数据流动的方式和手段。

MySQL提供了多种数据传输方式,以满足不同场景和需求的数据传输需求。

下面介绍几种常见的数据传输方式:1. TCP/IP协议TCP/IP协议是Internet上常用的协议之一。

在MySQL中,TCP/IP协议被广泛应用于应用程序和数据库服务器之间的数据传输。

MySQL技术在工业制造中的数据管理与生产分析

MySQL技术在工业制造中的数据管理与生产分析

MySQL技术在工业制造中的数据管理与生产分析一、引言在当今高度信息化的社会中,数据已成为企业决策和运营的重要依据。

对于工业制造企业来说,如何高效地管理和分析海量的生产数据是实现智能化生产的关键。

而MySQL作为一种开源的关系型数据库管理系统,提供了可靠的数据存储和处理能力,成为了众多工业制造企业的首选。

二、MySQL技术在工业制造中的数据管理1. 数据采集与存储工业制造过程中产生的生产数据包括设备运行数据、生产过程数据、质检数据等多种类型,这些数据需要经过采集、传输和存储。

MySQL提供了高效可靠的数据存储能力,可以通过编写数据采集程序或利用现有的数据传输协议,将多个数据源的数据实时采集到MySQL数据库中。

在数据存储方面,MySQL支持事务处理和并发控制,确保了数据的一致性和可靠性。

2. 数据清洗与整合由于工业制造中的数据来源多样且存在噪音和缺失,需要对数据进行清洗和整合,以保证数据的准确性和一致性。

MySQL提供了强大的数据清洗和转换工具,可以通过编写SQL语句和存储过程来实现数据清洗和整合的操作。

例如,可以通过使用正则表达式来过滤噪音数据,通过使用聚合函数来统计数据的汇总信息。

3. 数据访问与查询工业制造企业需要根据不同的需求对数据进行查询和分析。

MySQL提供了丰富的查询语言和索引机制,可以高效地进行数据检索。

同时,MySQL支持多用户并发访问,可以满足多人同时对数据进行访问和查询的需求。

三、MySQL技术在工业制造中的生产分析1. 生产监控与异常检测通过对生产数据的实时监控和分析,可以及时发现生产异常和故障,并采取相应的措施进行处理。

MySQL可以通过编写触发器和存储过程来实现实时监控和异常检测的功能。

例如,可以通过编写触发器来监控设备运行状态的变化,并在异常情况下发送警报信息。

2. 生产过程优化通过对生产数据的分析,可以发现生产过程中存在的问题和瓶颈,提出相应的改进措施。

MySQL可以通过编写复杂的查询语句和统计函数,对生产数据进行深入的分析。

MySQL源码分析

MySQL源码分析

MySQL源代码分析(2008-12-4)一、目录及文件BUILD 编译和链接源码client 接收用户SQL语句,进行编辑和初始化检查。

Docs 文档vio virtual I/O,包装client/server通信协议。

sql SQL解析并通过handler调用相应的底层函数。

storage 存储引擎目录,实现对files、rows、keys等的处理。

mysys MySQL System Library,如字符编码、快排、临时文件等相关操作dbug Fred Fish's debug library.pstack displays the process stack.regex what we use for our regular expressions function.strings the meaning of which is obvious.zlib Lempel-Ziv compression.configure.in 调用一系列autoconf宏来测试程序需要的或用到的特性是否存在,以及这些特性的功能。

makefile.am 指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成。

二、模块与核心数据结构1 模块Server Initialization Module描述:服务器启动时的初始化文件:sql/函数:main() ——入口init_common_variables()init_thread_environment()init_server_components() ——插件(plugin)初始化grant_init() in sql/sql_init_slave() in sql/get_options()Connection Manager描述:侦听来自客户端的连接,把请求分配到Thread Manager文件:sql/函数:handle_connections_sockets()Thread Manager描述:跟踪每个线程,并确保为每个用户连接分配一个线程文件:sql/函数:create_new_thread() ——入口start_cached_thread()结构:THD (prepared statements, server-side cursors, stored procedures等新特性)派生类(Query_arena, Statement, Security_context, Open_tables_state)Connection Thread描述:处理用户请求文件:sql/sql_函数:handle_one_connection()User Authentication Module描述:认证用户并初始化数据结构和参数变量的权限信息文件:sql/sql_, sql/函数:check_connection() ——入口acl_check_host() in sql/create_random_string() in sql/check_user() in sql/sql_acl_getroot() in sql/sql_Access Control Module描述:检查用户权限文件:sql/sql_函数:check_access() ——入口check_grant()check_table_access() in sql/sql_check_grant_column()acl_get()Parser描述:解析查询生成查询树Command Dispatcher描述:把请求分派到更底层的模块进行处理文件:sql/sql_函数:do_command()dispatch_command()Query Cache Module描述:缓存查询结果,通过返回缓存结果缩短查询的执行周期文件:sql/sql_Optimizer描述:根据查询请求创建最优策略并执行文件:sql/sql_函数:mysql_select() ——入口JOIN::prepare()JOIN::optimize()JOIN::exec()make_join_statistics()find_best_combination()optimize_cond()Table Manager描述:创建、读取、修改表定义文件(.frm),维护一个table cache,管理表级锁文件:sql/sql_, sql/, sql/, sql/函数:openfrm()mysql_create_frm()open_table()open_tables()open_ltable()mysql_lock_table()Table Modification Modules描述:负责表的creating、deleting、renaming、dropping、updating、inserting等操作文件:sql/…函数:mysql_update() and mysql_multi_update() in sql/sql_mysql_insert()mysql_create_table()mysql_alter_table()mysql_rm_table()mysql_delete()Table Maintenance Module描述:负责表的check、repair、back up、restore、optimize(defragment)、analyze(更新key distribution 统计)等操作文件:sql/sql_函数:mysql_admin _table() ——核心函数mysql_check_table()mysql_repair_table()mysql_backup _table()mysql_restore _table()mysql_optimize _table()mysql_analyze _table()Status Reporting Module描述:负责应答有关server configuration settings、performance tracking variables、table structure information、replication progress、condition of the table cache等信息的查询(以SHOW开头)函数:Abstracted Storage Engine Interface (Table Handler)描述:提供一个存储和检索的标准接口结构:抽象类handler数据结构handlerton ——插件集成Storage Engine Implementations (MyISAM, InnoDB, MEMORY, BerkeleyDB)描述:由handler派生,实现更底层的调用文件:sql/ha_myisam.hsql/ha_innodb.hsql/ha_heap.hsql/ha_ndbcluster.hmyisaminnobase/heap/ndb/Logging Module描述:维护higher-level(logical)日志,包括binary update log(一般用于replication)、command log(服务监控和调试),slow query log(查询优化追踪)结构:MYSQL_LOGTC_LOGReplication Master Module描述:负责master的replication功能Replication Slave Module描述:负责slave的replication功能Client/Server Protocol API描述:基于操作系统协议(如TCP/IP、local socket)之上的协议栈文件:sql/protocol.h, sql/, sql/net_类:Protocol派生类Protocol_simple, Protocol_prep, Protocol_cursor函数:my_net_read() in sql/net_my_net_write() in sql/net_net_store_data() in sql/send_ok() in sql/send_error() in sql/Low-Level Network I/O API描述:提供底层的network I/O和SSL会话抽象接口目录:vio/Core API描述:portable file I/O、内存管理、字符串操作、文件系统导航、格式化打印、数据结构和算法目录:mysys/, strings/2 数据结构ItemSQL语言某些结构体的基类,如literals、column references、session or globalTHD描述:线程描述符,如replication slave threads、delayed insert threadsIlink——侵入式链表结构,支持元素的自动删除Query_arena——free_list和mem_rootStatement ——State of a single command executed against this connection.Open_tables_state ——holds information about tables which were opened and locked by the thread.NET描述:网络连接描述符,处理client/server通信协议TABLE(st_table)描述:数据库表描述符,存放在table cache中。

mysql_real_connect的说明

mysql_real_connect的说明

mysql_real_connect的说明MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned intclient_flag)20.4.40.1 说明:mysql_real_connect()试图建立到运行host的一个MySQL数据库引擎的一个连接。

mysql_real_connect()在你可以执行任何其他API函数之前必须成功地完成,除了mysql_get_client_info()。

参数指定如下:第一个参数应该是一个现存MYSQL结构的地址。

在调用mysql_real_connect()之前,你必须调用mysql_init()初始化MYSQL结构。

见下面的例子。

1.Host:值可以是一个主机名或一个IP地址。

如果host是NULL或字符串"localhost",假定是到本地主机的一个连接。

如果OS支持套接字(Unix)或命名管道(Win32),使用他们而不是TCP/IP与服务器连接。

er:参数包含用户的MySQL登录ID。

如果user是NULL,假定是当前用户。

在Unix下,它是当前登录名。

在Windows ODBC下,必须明确地指定当前用户名字。

见16.4 怎样填写ODBC管理程序中各种域。

3.Passwd:参数为user包含口令。

如果passwd是NULL,只有在user表中对于有一个空白口令字段的用户的条目将被检查一个匹配。

这允许数据库主管设置MySQL权限,使用户获得不同的口令,取决于他们是否已经指定一个口令。

注意:不要试图在调用mysql_real_connect()前加密口令;口令加密自动被客户API处理。

mysql协议分析

mysql协议分析

mysql协议分析协议名称:MySQL协议分析一、协议概述MySQL协议是一种用于客户端与MySQL数据库服务器之间进行通信的协议。

本协议分析旨在深入理解MySQL协议的结构和功能,以及相关的数据包格式和交互流程。

二、协议结构MySQL协议采用基于TCP/IP的客户端-服务器模型,通过发送和接收数据包进行通信。

协议数据包由固定长度的头部和可变长度的有效载荷组成。

1. 头部结构MySQL协议的头部由5个字节组成,具体如下:- 第一个字节表示有效载荷的长度,不包括头部长度本身;- 接下来的4个字节表示序列号,用于标识数据包的顺序。

2. 数据包结构MySQL协议的数据包可以分为以下几种类型:- 连接请求数据包(COM_HANDSHAKE):客户端向服务器发起连接请求,包含客户端版本、用户名、密码等信息。

- 连接响应数据包(OK_Packet、ERR_Packet):服务器对连接请求进行响应,返回连接状态和错误信息。

- 查询请求数据包(COM_QUERY):客户端向服务器发送SQL查询语句。

- 查询响应数据包(ResultSet、ERR_Packet):服务器对查询请求进行响应,返回查询结果或者错误信息。

- 其他类型数据包:如COM_QUIT(断开连接请求)、COM_PING(保持连接请求)等。

三、协议交互流程MySQL协议的交互流程主要包括连接建立、查询请求和响应、断开连接等步骤。

1. 连接建立- 客户端向服务器发送连接请求数据包(COM_HANDSHAKE)。

- 服务器返回连接响应数据包(OK_Packet)或者错误数据包(ERR_Packet)。

2. 查询请求和响应- 客户端向服务器发送查询请求数据包(COM_QUERY),包含SQL查询语句。

- 服务器返回查询响应数据包(ResultSet)或者错误数据包(ERR_Packet)。

- 如果查询结果较大,可能会分为多个数据包进行传输。

3. 断开连接- 客户端向服务器发送断开连接请求数据包(COM_QUIT)。

mysql数据库的安全机制

mysql数据库的安全机制

MySQL数据库的安全机制引言随着信息技术的高速发展,互联网的普及和数字化的进程,数据库成为了现代企业中不可或缺的关键组成部分。

然而,数据库所存储的大量敏感数据也面临着安全风险。

为了保护这些数据不被未授权的访问、篡改或损坏,MySQL引入了多种安全机制。

本文将深入探讨MySQL数据库的安全机制,包括身份验证、访问控制、加密、审计和备份恢复等方面的内容。

1. 身份验证身份验证是数据库安全的第一道防线,用于确认用户的身份和权限。

MySQL提供了多种身份验证方法,包括基于密码的身份验证、SSL/TLS证书身份验证和PAM身份验证。

1.1 基于密码的身份验证MySQL的默认身份验证方法是基于密码的身份验证。

用户的密码保存在er 表中,密码以散列形式存储,确保了密码的安全性。

此外,MySQL还使用密码插件来提供更加安全的密码存储和交流方式,如使用SHA-256散列密码、外部加盐等。

1.2 SSL/TLS证书身份验证MySQL支持使用SSL/TLS证书进行身份验证,通过使用加密证书,可以确保通信过程中的安全性和数据的完整性。

这种身份验证方法可以防止中间人攻击和窃听。

1.3 PAM身份验证MySQL还支持使用PAM(Pluggable Authentication Modules)进行身份验证。

PAM 是一种通用的身份验证框架,可以集成多个认证机制,提供更灵活的身份验证方式。

使用PAM身份验证可以集成操作系统的认证机制,如LDAP、Kerberos等。

2. 访问控制访问控制用于控制用户对数据库的访问权限。

MySQL提供了灵活的访问控制机制,包括建立用户账号、授权和管理角色等。

2.1 用户账号管理MySQL使用GRANT和REVOKE语句来授予和撤销用户的权限。

通过GRANT语句,可以指定用户的身份验证方式、允许访问的数据库和表、允许执行的操作等。

REVOKE 语句用于撤销已授予的权限。

2.2 角色管理MySQL支持角色的概念,角色可以简化权限管理。

mysql-binlog-connector-java实现原理 -回复

mysql-binlog-connector-java实现原理 -回复

mysql-binlog-connector-java实现原理-回复MySQLBinLogConnectorJava是一个Java库,用于读取MySQL的二进制日志(binlog)文件。

它是基于MySQL的复制协议实现的,可以将binlog 文件解析为易于处理的数据格式。

通过使用MySQLBinLogConnectorJava,开发人员可以实时监控和处理MySQL 数据库的更改操作,实现数据库的同步和数据分析。

在本文中,将详细介绍MySQLBinLogConnectorJava的实现原理,包括其基本工作流程和关键组件。

一、MySQL的二进制日志(binlog)简介MySQL的二进制日志(binlog)是一种用于记录数据库更改操作的日志文件。

它包含了所有的插入、更新、删除等操作,以及对表结构的更改(如创建、修改、删除表等)。

二进制日志是MySQL数据库实现数据复制和恢复的重要组成部分。

二、MySQL的复制协议MySQL的复制协议用于实现数据库的复制和同步。

它基于Master-Slave 模式,其中一个MySQL服务器充当主服务器(Master),负责接收和处理所有的写操作;而其他MySQL服务器则充当从服务器(Slave),通过复制协议从主服务器复制并执行所有的写操作。

复制协议使用了二进制日志(binlog)文件来传递更改操作。

三、MySQLBinLogConnectorJava的工作原理MySQLBinLogConnectorJava使用MySQL的复制协议来读取和解析MySQL的二进制日志文件。

1. 连接MySQL服务器首先,MySQLBinLogConnectorJava需要连接到MySQL服务器。

它使用Java提供的JDBC(Java Database Connectivity)接口来建立与MySQL数据库的连接。

2. 获取MySQL的binlog文件信息一旦连接建立成功,MySQLBinLogConnectorJava会发送一个查询命令给MySQL服务器,获取当前正在使用的二进制日志文件的相关信息,包括文件名、文件位置等。

MySQL数据库安全解决方案

MySQL数据库安全解决方案

MySQL数据库安全解决方案MySQL数据库是一种常用的关系型数据库管理系统,被广泛用于网站、应用程序等领域。

然而,由于其开放性和广泛应用,MySQL数据库也常受到各种安全威胁。

为了保障数据的安全性,企业和个人需要采取一系列的措施来保护MySQL数据库。

本文将介绍一些MySQL数据库安全的解决方案,旨在帮助用户提高数据的安全性。

1.安全认证首先,确保MySQL数据库的安全认证机制是启用的。

通过在MySQL配置文件中设置合适的身份验证方法,如使用用户名和密码来进行身份验证。

此外,还可以启用SSL加密来保护数据库连接中的数据传输。

2.更新和升级及时更新和升级MySQL数据库是保护数据库安全的重要步骤。

MySQL的开发团队经常修复各种安全漏洞,并定期发布新版本。

用户应及时关注并安装更新补丁,以确保数据库不容易受到已知的安全漏洞攻击。

3.数据库备份定期备份数据库可以提供一种应对数据丢失、系统故障或恶意攻击的保护措施。

备份可以将数据库恢复到最后一次备份的状态,并尽量减少数据的丢失。

数据库备份可以通过使用MySQL内置的备份工具,如mysqldump命令,进行定期定时的备份。

4.数据访问权限控制设置合适的用户权限是保护数据库的关键。

MySQL提供了丰富的权限管理功能,可以通过GRANT和REVOKE语句来控制用户对数据库和表的访问权限。

合理划分用户角色和权限,只给予必要的权限,避免将全部权限授予所有用户。

5.强密码策略为了增加密码的复杂性和安全性,应采取一些密码策略来设置数据库用户密码。

密码长度应足够长,建议至少8个字符,并结合大小写字母、数字和特殊字符的组合。

另外,定期更改密码也是保护数据库安全的重要步骤。

6.网络安全保护数据库服务器的网络安全也十分重要。

首先,确保数据库服务器只开放必要的端口,并限制外部访问。

如果需要远程访问MySQL数据库,则应使用VPN等安全手段来保护数据传输。

此外,防火墙和入侵检测系统也是保护数据库服务器免受未经授权的访问的有效工具。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

resultset packet - row
command packet
● 命令包,包括我们的sql语句还有一些常见的命令. ● 包体首字母表示命令的类型(include/mysql_com.h),大部 分命令都是COM_QUERY.
网络协议关键函数
● net_write_command(sql/net_)
● eof包是用于分割field packet和row packet. ● 包体首字节为254 ● sql/:net_send_eof
resultset packet - row
● ● ● ● ● row packet里才是真正的数据包.一行数据一个packet. row里的每个字段都是length coded binary 字段的个数在header packet里 sql/client.c:cli_read_rows sql/:Protocol::write()
MySQL协议分析
@hoterran
议程
协议头 协议类型 网络协议相关函数 NET缓冲 VIO缓冲 MySQL api
协议头
● 数据变成在网络里传输的数据,需要额外的在头部添加4个 字节的包头.
1. 2. packet length(3字节), 包体的长度 packet number(1字节), 从0开始的递增的,到了255又从0开始.
eof(1) + row(N) + eof(1)

所以这个例子的MySQL packet的个数是12个
resultset packet - header
● field packet number决定了接下 来的field packet的个数.
Байду номын сангаас
● 一个返回6行记录,3个字段的查询语句
resultset packet - field
所有的sql最终调用这个命令发送出去. ● my_net_write(sql/net_) 连接阶段的socket write操作调用这个函数. ● my_net_read 读取包,会判断包大小,是否是分包 ● my_real_read 解析MySQL packet,第一次读取4字节,根据packet length再 读取余下来的长度 ● cli_safe_read 客户端解包函数,包含了my_net_read
● length coded binary
避免binary unsafe string, 字符串的长度保存在字符串的前面 ■ length<251 1 byte ■ length <256^2 3 byte(第一个byte是252) ■ length<256^3 4byte(第一个byte是253) ■ else 9byte(第一个byte是254)
VIO缓冲
● 从my_read_read可以看出每次packet读取都是按需读 取, 为了减少系统调用,vio层面加了一个read_buffer. ● 每次读取前先判断vio->read_buffer所需数据的长度是否 足够.如果存在则直接copy. 如果不够,则触发一次socket read 读取2048个字(vio/viosocket.c:vio_read_buff)
handshake packet
● 该协议由服务端发送客户端 ● 括号内为字节数,字节数为n为 是null-terminated string;字节数 为大写的N表示length code binary. ● salt就是scramble.分成两个部 分是为了兼容4.1版本 ● sql_:check_connection ● sql_client.c:mysql_real_connect
● sql “select 1” 的网络协议是?
协议头
● packet length
三个字节意味着MySQL packet最大16M 大于16M则被分包(net_write_command, my_net_write)
● packet number
分包从0开始,依次递增. 每一次执行sql, packet_number清零(sql/net_serv.c:net_clear)
● 结果集中一个字段一个field packet. ● tables_alias是sql语句里表的别名,org_table才是表的真 实名字. ● sql/:Protocol::send_fields ● sql/client.c:cli_read_query_result
resultset packet - eof
● ok包,命令和insert,update, delete的返回结果 ● 包体首字节为0. ● insert_id, affect_rows也是 一并发过来. ● src/:net_send_ok
error packet
● ● ● ● ● ● ● 错误的命令,非法的sql的返回包 包体首字节为255. error code就是CR_***,include/errmsg.h sqlstate marker是# sqlstate是错误状态,include/sql_state.h message是错误的信息 sql/:net_send_error_packet
MySQL api
● 数据从mysql_send_query处发送给服务端,实际调用的是 net_write_command. ● cli_read_query_result解析header packet, field packet,获 得field_count的个数 ● mysql_store_result解析了row packet,并存储在result>data里 ● myql_fetch_row其实遍历result->data
协议类型
● ● ● ● handshake auth ok|error resultset
○ ○ ○ ○ header field eof row
● command packet
连接时的交互
协议说明
● 协议内字段分三种形式
○ 固定长度(include/my_global.h) ■ uint*korr 解包 ■ int*store 封包 ○ length coded binary(sql-common/pack.c) ■ net_field_length 解包 ■ net_store_length 封包 ○ null-terminated string
auth packet
● 该协议是从客户端对密码使用 scramble加密后发送到服务端 ● 其中databasename是可选的. salt就是加密后的密码. ● sql_client.c:mysql_real_connect ● sql_connect.c:check_connection
ok packet
resultset packet
● 结果集的数据包,由多个packet组合而成 ● 例如查询一个结构集,顺序如下:
○ ○ ○ ○ ○ header field1....fieldN eof row1...rowN eof
● sql/client.c:cli_read_query_result ● 下面是一个sql "select * from d"查询结果集的例子,结果集 是6行,3个字段 ○ 公式:假设结果集有N行, M个字段.则包的个数为,header(1) + field(M) +
NET缓冲
● 每次socket操作都会先把数据写,读到net->buff,这是一个 ● ● ●
缓冲区, 减少系统调用调用的次数. 当写入的数据和buff内的数据超过buff大小才会发出一次 write操作,然后再把要写入的buff里插入数, 写入不会导致 buff区区域扩展.(sql/net_:net_write_buff). net->buff大小初始net->max_packet, 读取会导致会导致 buff的realloc最大net->max_packet_size 一次sql命令的结束都会调用net_flush,把buff里的数据都 写到socket里.
相关文档
最新文档