MySQL模拟:线上误update的恢复
作为DBA,细心、沉稳是首要的基本素质。不过总有那么一会心烦意乱或者开发同学出现误操作之类的。。。这里模拟一个误update操作,然后恢复。
如果开发同学有误操作之后最好先别乱动生产环境,需要记录几个信息给DBA同学来恢复数据。
1:binlog_format、autocommit、binlog位置、误操作的时间点
mysql> SHOW VARIABLES LIKE '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec) mysql> SHOW MASTER STATUS \G
*************************** 1. row ***************************
File: binlog.000048
Position: 442
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
时间点大约在2015年6月29日 16:50:00 - 2015年6月29日 17:50:00之间
mysql> SHOW VARIABLES LIKE '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
2:如果在一个事物内的操作,同时autocommit是off的话,可以直接尝试回滚。看看是否可以恢复过来。
3:原始数据
mysql> select * from t1.t1;
+------+------+
| id1 | name |
+------+------+
| 8 | u11 |
| 8 | u12 |
| 8 | u13 |
| 8 | u14 |
| 8 | u15 |
| 8 | name |
| 8 | name |
| 8 | name |
| 8 | name |
+------+------+
9 rows in set (0.00 sec)
误操作之后
mysql> update t1.t1 set id1 = 10;
Query OK, 9 rows affected (0.00 sec)
Rows matched: 9 Changed: 9 Warnings: 0 mysql> commit;
Query OK, 0 rows affected (0.01 sec)
恢复开始:
1:找到当前写入的binlog信息:
mysql> SHOW MASTER STATUS \G
*************************** 1. row ***************************
File: binlog.000048
Position: 777
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
2:估计误操作的时间点:2015-06-29 16:50:00和2015-06-29 17:20:00 之间,
3:另外开一个窗口解析binlog
mysqlbinlog --start-datetime='2015-06-29 01:30:00' --stop-datetime='2015-06-29 02:10:00' -vv binlog.000048
[root@localhost mysqllog]# mysqlbinlog --start-datetime='2015-06-29 01:30:00' --stop-datetime='2015-06-29 02:10:00' -vv binlog.000048
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#150629 1:44:39 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.20-log created 150629 1:44:39
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
dwWRVQ8BAAAAZwAAAGsAAAABAAQANS41LjIwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
# at 107
#150629 1:45:06 server id 1 end_log_pos 173 Query thread_id=7 exec_time=0 error_code=0
SET TIMESTAMP=1435567506/*!*/;
SET @@session.pseudo_thread_id=7/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 173
# at 215
#150629 1:44:56 server id 1 end_log_pos 215 Table_map: `t1`.`t1` mapped to number 33
#150629 1:44:56 server id 1 end_log_pos 415 Update_rows: table id 33 flags: STMT_END_F BINLOG '
iAWRVRMBAAAAKgAAANcAAAAAACEAAAAAAAEAAnQxAAJ0MQACA/4C/jwD
iAWRVRgBAAAAyAAAAJ8BAAAAACEAAAAAAAEAAv///AYAAAADdTEx/AgAAAADdTEx/AYAAAADdTEy
/AgAAAADdTEy/AYAAAADdTEz/AgAAAADdTEz/AYAAAADdTE0/AgAAAADdTE0/AYAAAADdTE1/AgA
AAADdTE1/AYAAAAEbmFtZfwIAAAABG5hbWX8BgAAAARuYW1l/AgAAAAEbmFtZfwGAAAABG5hbWX8
CAAAAARuYW1l/AYAAAAEbmFtZfwIAAAABG5hbWU=
'/*!*/;
### UPDATE `t1`.`t1`
### WHERE
### @1=6 /* INT meta=0 nullable=1 is_null=0 */
### @2='u11' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u11' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=6 /* INT meta=0 nullable=1 is_null=0 */
### @2='u12' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u12' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=6 /* INT meta=0 nullable=1 is_null=0 */
### @2='u13' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u13' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=6 /* INT meta=0 nullable=1 is_null=0 */
### @2='u14' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u14' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=6 /* INT meta=0 nullable=1 is_null=0 */
### @2='u15' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u15' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=6 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=6 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=6 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=6 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
# at 415
#150629 1:45:06 server id 1 end_log_pos 442 Xid = 313
COMMIT/*!*/;
# at 442
#150629 2:00:29 server id 1 end_log_pos 508 Query thread_id=7 exec_time=0 error_code=0
SET TIMESTAMP=1435568429/*!*/;
BEGIN
/*!*/;
# at 508
# at 550
#150629 2:00:27 server id 1 end_log_pos 550 Table_map: `t1`.`t1` mapped to number 33
#150629 2:00:27 server id 1 end_log_pos 750 Update_rows: table id 33 flags: STMT_END_F BINLOG '
KwmRVRMBAAAAKgAAACYCAAAAACEAAAAAAAEAAnQxAAJ0MQACA/4C/jwD
KwmRVRgBAAAAyAAAAO4CAAAAACEAAAAAAAEAAv///AgAAAADdTEx/AoAAAADdTEx/AgAAAADdTEy
/AoAAAADdTEy/AgAAAADdTEz/AoAAAADdTEz/AgAAAADdTE0/AoAAAADdTE0/AgAAAADdTE1/AoA
AAADdTE1/AgAAAAEbmFtZfwKAAAABG5hbWX8CAAAAARuYW1l/AoAAAAEbmFtZfwIAAAABG5hbWX8
CgAAAARuYW1l/AgAAAAEbmFtZfwKAAAABG5hbWU=
'/*!*/;
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u11' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='u11' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u12' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='u12' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u13' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='u13' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u14' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='u14' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u15' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='u15' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
# at 750
#150629 2:00:29 server id 1 end_log_pos 777 Xid = 318
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
找到误操作的update:
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u11' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='u11' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u12' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='u12' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u13' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='u13' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u14' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='u14' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='u15' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='u15' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### SET
### @1=10 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
### UPDATE `t1`.`t1`
### WHERE
### @1=8 /* INT meta=0 nullable=1 is_null=0 */
### @2='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
处理之后的误操作语句
UPDATE `t1`.`t1`
WHERE
id1=8 /* INT meta=0 nullable=1 is_null=0 */
name='u11' /* STRING(60) meta=65084 nullable=1 is_null=0 */
SET
id1=10 /* INT meta=0 nullable=1 is_null=0 */
name='u11' /* STRING(60) meta=65084 nullable=1 is_null=0 */
UPDATE `t1`.`t1`
WHERE
id1=8 /* INT meta=0 nullable=1 is_null=0 */
name='u12' /* STRING(60) meta=65084 nullable=1 is_null=0 */
SET
id1=10 /* INT meta=0 nullable=1 is_null=0 */
name='u12' /* STRING(60) meta=65084 nullable=1 is_null=0 */
UPDATE `t1`.`t1`
WHERE
id1=8 /* INT meta=0 nullable=1 is_null=0 */
name='u13' /* STRING(60) meta=65084 nullable=1 is_null=0 */
SET
id1=10 /* INT meta=0 nullable=1 is_null=0 */
name='u13' /* STRING(60) meta=65084 nullable=1 is_null=0 */
UPDATE `t1`.`t1`
WHERE
id1=8 /* INT meta=0 nullable=1 is_null=0 */
name='u14' /* STRING(60) meta=65084 nullable=1 is_null=0 */
SET
id1=10 /* INT meta=0 nullable=1 is_null=0 */
name='u14' /* STRING(60) meta=65084 nullable=1 is_null=0 */
UPDATE `t1`.`t1`
WHERE
id1=8 /* INT meta=0 nullable=1 is_null=0 */
name='u15' /* STRING(60) meta=65084 nullable=1 is_null=0 */
SET
id1=10 /* INT meta=0 nullable=1 is_null=0 */
name='u15' /* STRING(60) meta=65084 nullable=1 is_null=0 */
UPDATE `t1`.`t1`
WHERE
id1=8 /* INT meta=0 nullable=1 is_null=0 */
name='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
SET
id1=10 /* INT meta=0 nullable=1 is_null=0 */
name='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
UPDATE `t1`.`t1`
WHERE
id1=8 /* INT meta=0 nullable=1 is_null=0 */
name='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
SET
id1=10 /* INT meta=0 nullable=1 is_null=0 */
name='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
UPDATE `t1`.`t1`
WHERE
id1=8 /* INT meta=0 nullable=1 is_null=0 */
name='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
SET
id1=10 /* INT meta=0 nullable=1 is_null=0 */
name='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
UPDATE `t1`.`t1`
WHERE
id1=8 /* INT meta=0 nullable=1 is_null=0 */
name='name' /* STRING(60) meta=65084 nullable=1 is_null=0 */
根据对应的语句一句一句恢复即可。
MySQL模拟:线上误update的恢复的更多相关文章
- 【原创】MySQL Replay线上流量压测工具
一. 背景 去年做过一次mysql trace 重放的测试,由于performance schema本身采集样本的长度等限制,实际回放的成功率比较低. 最近找到一款开源的工具,基于TCPCopy实现了 ...
- [MySQL CPU]线上飙升800%,load达到12的解决过程
接到报警通知,负载过高,达到800%,load也过高,有11了. MySQL版本号为5.6.12-log 1 top 之后,确实是mysqld进程占领了全部资源. 2 查看error日志,无不论什么异 ...
- MySQL Cluster线上管理节点配置文件-数据节点32G内存
网上的朋友提供的,仅供参考. [NDBD DEFAULT] NoOfReplicas= 2 DataMemory=20G IndexMemory=5G MaxNoOfConcurrentTransac ...
- Linux 上通过binlog文件 恢复mysql 数据库详细步骤
一.binlog 介绍 服务器的二进制日志记录着该数据库的所有增删改的操作日志(前提是要在自己的服务器上开启binlog),还包括了这些操作的执行时间.为了显示这些二进制内容,我们可以使用mysqlb ...
- 转:SqlServer2008误操作数据(delete或者update)后恢复数据
Sqlserver2008误操作数据(delete或者update)后恢复数据(转) 实际工作中,有时会直接在数据库中操作数据,比如对数据进行delete或者update操作,当进行这些操作的时候,如 ...
- SqlServer2008误操作数据(delete或者update)后恢复数据
实际工作中,有时会直接在数据库中操作数据,比如对数据进行delete或者update操作,当进行这些操作的时候,如果没有加上where条件或者where条件不合理,那么导致的结果可想而知,如果操作的又 ...
- binlog2sql实现MySQL误操作的恢复
对于MySQL数据库中的误操作删除数据的恢复问题,可以使用基于MySQL中binlog做到类似于闪回或者生成反向操作的SQL语句来实现,是MySQL中一个非常实用的功能.原理不难理解,基于MySQL的 ...
- MySQL binlog2sql实现MySQL误操作的恢复
对于MySQL数据库中的误操作删除数据的恢复问题,可以使用基于MySQL中binlog做到类似于闪回或者生成反向操作的SQL语句来实现,是MySQL中一个非常实用的功能.原理不难理解,基于MySQL的 ...
- 【MySQL】记一次线上重大事故:二狗子竟然把线上数据库删了!!
写在前面 估计二狗子这几天是大姨夫来了,心情很郁闷,情绪也很低落,工作的时候也有点心不在焉.让他发个版本,结果,一行命令下去把线上的数据库删了!你没听错:是删掉了线上的数据库!运营那边顿时炸了锅:怎么 ...
随机推荐
- Myeclipse/eclipse的Web project改写成Maven项目
1.导入或建立web项目时加上maven的设置 2.加入如下代码:<dependencies>标签下加入红色部分 <dependencies> <dependency&g ...
- WordPaster-Firefox浏览器控件安装方法
将WordPaster.xpi拖到Firefox扩展面板中安装 新版Firefox可能无法通过验证,如果Firefox提示无法安装,则需要进入about:config中将xpinstall ...
- angularjs+jasmine单元测试入门
使用cordova.angularjs.ionic开发hybrid App有一段时间了.为了做单元测试,之前一直是把要测的某一部分产品代码复制到另一个单独的工程中来写测试代码,测好了以后再复制回去.弊 ...
- ORACLE 中NUMBER 类型 低精度转换成高精度
例如: 表User中有一个字段 salary Number(10,3), 如果想把字段salary的类型提高精度到salary Number(10,6),保留六位小数, 解决办法:1,ALTER ...
- 数据库知识整理<一>
关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数 ...
- 解决dnu restore时的“Cannot handle address family”问题
前几天在使用基于 mono 的 dnx 中的 dnu restore 命令安装 nuget 包包时,遇到了 “Cannot handle address family” 错误,错误详情如下: Cann ...
- UML建模语言入门 -- 用例视图详解 用例视图建模实战
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 一. 用例视图概述 用例视图表述哪些 ...
- SQL Server 重新初始化系统数据库中的单引号问题
在最近的数据库跨机房迁移中,由于硬件的限制,需要滚动式地将数据库一台台迁移到新机房,先在新机房搭建一个新环境,将数据迁移过去,再将旧机房的机器下架搬到新机房,重新配置后用于下一轮的升级,重新配置过程中 ...
- Nginx学习笔记(九) 配置文件详细说明
配置文件详细说明 工作了几个月要开始做一些后台开发,免不了接触nginx,以前一般只是简单的使用,更多的分析内部模块的具体实现,为了部署需要进一步掌握配置方法. 全局配置信息 #nginx worke ...
- [C++] socket - 1 [简单TCP通信C\S代码]
服务端: #include<iostream> #include<winsock2.h> #include<stdio.h> #pragma comment(lib ...