自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

进击的小学生

To be or not to be, this is a question.

  • 博客(67)
  • 资源 (10)
  • 收藏
  • 关注

原创 0-Linux 网络编程修炼指南——内功心法

学习交流群: Linux 学习交流群 610441700说明:本系列文章并不能取代 《UNP》这本旷世之作,文章中难免有错误与不足之处,希望读者们遇到有疑问的地方可以加群互相交流,共同进步。写这一系列文章的目的有三个:一是为了提升自己对 linux 的理解,二是锻炼自己能够把知识点讲清楚,三是希望能更好的帮助基础薄弱的同学能够学习 UNP。在学习 unix 网络编程前,请...

2017-04-04 17:09:48 19808 51

原创 64-TCP/UDP 混合服务器

本文将为基本的 UDP 套接字编程这一章画上句号。这一篇文章主要将前面学习过的 TCP 和这一章的 UDP 结合起来,做一个既能接收 TCP 连接,又能接收 UDP 报文的回射服务器程序。1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用

2017-04-27 19:14:14 1509 1

原创 63-不可靠的 UDP 协议

本文我们对 UDP 的可靠性进行测试。1.程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/echo_udp/unreliable。2. 测试程序 st程序 st

2017-04-27 16:03:26 1121 1

原创 62-UDP 与 connect

在上一篇文章中,非常详细的叙述了有连接和无连接的区别,并严格的定义了什么是有连接。然后讲解了使用 connect 函数将 UDP 套接字设置成有连接的。本文我们继续讨论有连接和无连接 UDP 的区别。1. 多次调用 connect 函数上一讲我们已经知道 connect 函数可以把 UDP 套接字设置成有连接的。但是如果多次调用 connect 会怎样呢?主要有以下两个目的:重新指定 peerna

2017-04-27 13:26:31 820 4

原创 61-面向连接的 UDP

前面我们已经知道,UDP 编程中的调用 sendto 和 recvfrom 产生的错误是不会返回的。主要原因在于套接字是无连接的。要想让它们返回错误,只有让套接字变成有连接的。1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pu

2017-04-27 13:01:07 1999 1

原创 60-客户端也能做服务器?

本文的标题预示着接下来我们要做一件有意思的事,之前我们写的客户端程序,也可以拿来做服务器使用。1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/echo_ud

2017-04-27 10:03:36 1259 2

原创 59-UDP 数据报丢失

1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/echo_udp/basic。2. UDP 数据报丢失UDP 是不可靠的,它不像 TCP 能够保证数据一定到

2017-04-27 08:52:55 1699 1

原创 58-基于 UDP 协议的回射服务器

1. UDP 协议概述UDP 协议比 TCP 协议要简单的多,它是一种无连接的协议。无连接,意味着各个报文没有顺序性,你可能先发了一个数据包 A,后发一个数据包 B,结果对方却先收到 B,后收到 A.UDP 协议首部也非常简单,如图 1. 图1 UDP 首部 UDP 协议不提供可靠性,这意味着不能保证对端一定能收到数据。2. 本文实验所用的程序路径代码托管在 gitos 上,请使用下面的命令

2017-04-26 20:59:13 1310 1

原创 57-其它套接字选项

还有很多套接字选项,比如 SO_KEEPALIVE,SO_RCVBUF, SO_SNDBUF 等,这些就不打算在博客里详细去实验,大家可以自己使用 opt 程序进行实验。以后如果我们遇到了非得用它的时候,再会详细的去讨论它们,本章我们主要掌握几个常见的就行,我们的目的是学会使用套接字选项来控制 TCP 等协议的行为。还有很多像 ipv6 套接字选项,sctp 套接字选项,就不用去探究了,等到我们真正

2017-04-26 14:22:27 771 2

原创 56-套接字选项(TCP_CORK)

Nagle 算法尽量减少小分组出现在网络上,而 TCP_CORK 是完全避免小分组出现在网络上。该选项是在 Linux 2.2 才引入的。cork 这个单词,意为“塞子”,我们把 TCP 发送缓冲区想象成一个水池,而 cork 的作用就是把这个水池的出口堵住,直到下面的事情发生才会拔掉塞子,发送数据:水池满了达到一定的大小,比如超过 MSS 了一段时间都没有水进来(比如 200ms)遇到 F

2017-04-26 12:58:23 1283 1

原创 55-套接字选项(TCP_NODELAY)

开启本选项,将禁止 Nagle 算法。有关 Nagle 算法的细节,请参考《TCP 协议(Nagle) 》。1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/

2017-04-26 10:38:03 1872 1

原创 54-套接字选项(SO_LINGER)

SO_LINGER 是相当复杂的选项之一,它主要影响 close 和 shutdown 函数的行为(参考 man 手册),为了方便讨论,后面我以 close 为例。在不同的平台上,SO_LINGER 选项表现行为也不一样,不同的类 unix 系统不一样,windows 和 linux 也不一样,这实在是太麻烦了。本文将在 centos7 上对此选项的行为进行分析,然后不加证明的引用一篇针对 SO_L

2017-04-26 09:47:20 1850 1

原创 53-套接字选项(SO_REUSEADDR)

SO_REUSEADDR 是非常常用的选项之一,它有四个功能,我待会再写,接下来先看实验。1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/options/o

2017-04-25 19:21:32 1355 1

原创 52-打印套接字选项

为了方便套接字选项的学习,打印套接字选项的值,让我们直观的去感受它的存在是很有必要的。1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 Git pull 更新一下。本节程序所使用的程序路径是 unp/program/options/sho

2017-04-25 15:16:18 946 1

原创 51-套接字选项(概述)

相信你学过前面的 TCP 协议也知道,里头的算法非常多,有些算法你可以开启,有些你可以关闭。比如你可以设置发送和接收缓冲区大小,也可以设置是否打开 Nagle 算法等等。这些是如何做到的呢?有很多方法可以用来获取和设置影响套接字的选项:getsockopt 和 setsockopt 函数fcntl 函数ioctl 函数大多数情况,我们都使用 getsockopt 和 setsockopt 函

2017-04-25 14:25:39 1173 1

原创 50-使用 epoll 改写服务器

使用 epoll 改写服务器,会让我们的程序变得更加简单、高效。1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/echo/multiplexing_epol

2017-04-24 15:12:01 1473

原创 49-使用 poll 改写服务器

在前面,我们使用了 select 改写了服务器,本文使用 poll 来改写服务器。1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/echo/multiple

2017-04-24 13:50:35 1056 3

原创 48-拒绝服务型攻击(Denial-of-Service Attacks)

拒绝服务型攻击(Denial-of-Service Attacks),简称 dos 攻击。它针对服务器漏洞,使用特殊手段消耗服务器资源,从而达到服务器无法正常为其它客户端提供正常服务的目的。是的,我们之前用 select 改写的服务器就存在漏洞。有没有觉得,网络编程太难了?我也觉得太难,因为你需要应付各种各样的 bug,漏洞。接下来,我就来演示一个针对我们的 echo 服务器发起的 dos 攻击。1

2017-04-24 12:46:30 6476 2

原创 47-将多进程并发服务器改成 IO 复用

只有趟过各种坑,解决了各种离奇古怪的网络编程异常,才能一步一步的提升,再一步一步的学习新的技术。前面的程序,我们只是先拿客户端进行了开刀,将其修改成了 IO 多路复用模型,因为它最简单。后面我还看到,即使这样很简单,但是还有很多很多的坑等着我们去填,其中包括批量输入产生的问题,IO 缓冲与 IO 复用混合使用的问题。在没有系统的学习前,你去趟网络这趟浑水,很可能一不小心你就犯了错误,而且这种隐秘的错

2017-04-24 11:29:11 1420 4

原创 46-不要将 IO 复用与 stdio 混合

别以为上一节我们修复了那个 bug 就没事了。还有一个非常隐秘的错误,这里必须要指出来: 不要将 stdio 库提供的 C 语言函数与 IO 复用混合使用!!!1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新

2017-04-24 10:16:07 1146 2

原创 45-批量输入异常处理(shutdown 函数)

本文解决上一篇文章遇见的 bug.1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/echo/multiplexing_select_client_shutd

2017-04-23 18:41:03 1264 3

原创 44-批量输入异常

1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是unp/program/echo/multiplexing_select_client。2. 使用重定向完成批量输入上一节,我们使用了

2017-04-23 17:44:47 1096 1

原创 43-使用 select 改进客户端

1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/echo/multiplexing_select_client。2. 回忆 select2.1 函数原型 /

2017-04-23 15:28:32 1416 1

原创 42-IO 多路复用

1. 概述早在学习《Linux 环境编程笔记》的时候,我们学已经把 IO 多路复用的知识系统的介绍了,它主要包括 select、poll 和 epoll 技术。如果你还没有熟练的掌握这些知识,请参考 《Linux 环境编程笔记》的第十二章,一共有 9 篇文章,希望能能熟练掌握。在网络编程中,我并不打算将这些知识点重复讲解,而是作为网络编程的一个应用。在早期的 unix 系统中,那时候还不支持多线程的

2017-04-23 14:51:02 1754 1

原创 41-连接异常(服务器崩溃后重启)

这一种情况比上一篇崩溃后不重启的情况要简单的多,区别就在于让服务器(机器)崩溃,然后重新启动机器。请务必复习《半打开的 TCP 连接》。1. 程序路径代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径

2017-04-23 14:28:01 2584 1

原创 40-连接异常(服务器崩溃)

说服务器崩溃,言外之意就是说服务器挂了,但是没有发送 FIN 报文给客户端。不管是崩溃也好,服务器断网也好,还是中间路由器故障,只要客户机发送数据给对方,数据达到不了对方,或对方数据传送不过来,客户端和服务器都互相不能感知到对方是否出现异常。所以,模拟服务器崩溃,我们可以让服务器断网,一方面是不让服务器发送报文给客户端,另一方面客户端发送的报文也到不了服务器。实际上,本文实验在不久前讲超时重传的时候

2017-04-22 19:37:17 1919 1

原创 39-连接断开异常(引发 SIGPIPE)

代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。1. 相关程序本次实验所使用的程序路径是 unp/program/echo/exception_sigpipe。这个程序与之前的 processzombie 并没有什么本质上

2017-04-22 17:19:26 1160 2

原创 38-连接断开异常(服务器进程终止)

代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本次实验所使用的程序路径仍然是 unp/program/echo/processzombie。processzombie 程序看起来似乎已经完美无缺了,但是...

2017-04-22 15:39:04 2466 1

原创 37-多进程并发服务器(并发测试)

因为我们没有大量的测试机器,所以只能在单机上模拟大量客户端去连接服务器。代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git如果你已经 clone 过这个代码了,请使用 git pull 更新一下。1. 客户端与服务器程序客户端本文所使用的客户端程序路径是:unp/program/concurr

2017-04-21 13:36:38 2147 1

原创 36-多进程并发服务器(僵尸进程与信号处理)

在上一篇文章中,最后遗留了一个僵尸进程的问题。一旦客户端关闭连接,服务器子进程就会退出,然而父进程仍然存在,就产生了“白发人送黑发人”的场景。如果父进程没有主动回收(wait)子进程,或者没有忽略 SIGCHLD 信号,退出的子进程就会成为僵尸进程。代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.gi

2017-04-21 09:59:53 1935

原创 35-并发服务器(多进程)

待你进一步完善了前面的 echo 服务器后,也处理了对端发送而来的 RST 段而导致的错误。现在,我们遇到了一个新问题,即客户端在关闭退出后,服务器也关闭退出了。1. 让服务器永远运行解决的办法很简单,我们将 server 改进为下面这样:void server_routine() { // bind, listen while(1) { sockfd = accept(li

2017-04-20 17:08:11 1628 1

原创 34-异常处理(accept 返回前连接中止)

网络编程的难度在于异常状况的处理。在前面学习 TCP 协议的时候,我们就分析过各种连接异常,断开异常等等,大家要把各种情况烂记于心。本文我们探讨一种比较特殊的情况,即客户端连接建立成功后(进入 ESTABLISHED 状态),立即关闭连接退出。而此时服务器中的 accept 函数还没调用或者还没有返回。1. 实验代码1.1 代码托管地址git clone https://git.oschina.ne

2017-04-20 10:40:37 5104 2

原创 33-基于 TCP 的回射服务器

有些同学可能没有完成上一节留下的任务。所以,还是有必要在浏览一下整个程序的结构,不然大家可能看看文章也就过去了。如果你还没有 git clone,赶紧的把下面命令输入到你的机器中执行。https://git.oschina.net/ivan_allen/unp.git1. 文件浏览 图1 相关文件 目前在 unp/program 下,有一个 echo (回射服务器)文件夹,它下面存的全是不同

2017-04-19 20:01:02 1862 1

原创 23-TCP 协议(紧急标志)

1. 紧急标志当你再次看到图 1 时,相信你已经无比的亲切,再观察下面彩色的 6 个标志位,有 5 个你已经熟知了,还剩下最后一个 URG,对,就是图 1 中那个鲜红的,醒目的那个位置。 图1 TCP 首部 除此之外,还有一个字段—— 16 位紧急指针,它正是配合 URG 标志位一起使用的,言外之意就是这个字段只有在 URG 被置位时才有意义。因为只有一个紧急指针,这也意味着它只能标识一个字

2017-04-19 17:29:00 9954 3

原创 32-网络编程概述

1. 预备知识从网络编程开始(基于 socket 套接字的编程),我们要用到很多很多在Linux 环境编程中学到的知识,比较典型的就是信号处理,多进程,多线程这些知识。如果你对这些东西感觉还是很模糊,后面学习起来会相当困难。我并不打算把这些知识在网络编程中重复,所以如果你对这些知识感觉很困惑,请跳到《Linux环境编程学习笔记》中学习。另一方面,有关基本的网络编程基础,在《Linux环境编程学习笔记

2017-04-19 13:53:48 1812

原创 31-TCP 协议(保活定时器)

1. Keep AliveTCP 保活定时器,Keep Alive,特别强调一下,不是 HTTP 协议里的那个 Keep Alive.在 HTTP 中,keep alive 是在应用层实现的,目的在于延长连接时间,即应用层服务器如果在一定时间内(通过 keep alive 进行设置)没有和客户端交互,就关闭连接。感兴趣的朋友可以自行 baidu or google.TCP 中的 Keepalive

2017-04-16 18:00:36 2295

原创 30-TCP 协议(糊涂窗口综合症)

1. 糊涂窗口综合症糊涂窗口综合症,这个名字很有意思,原文叫 Silly Window Syndrome,简称 SWS.一看到窗口,我们就应该反应过来这是流量控制中的东西。SWS 是这样一种情况:接收方通告了一个 1 字节的窗口给发送方,然后发送方发送了 1 字节的数据给接收方。接着,接收方又通告了一个 1 字节的窗口,这样持续下去,使网络的效率很低。2. 解决 SWS有两种办法可以解决此问题:针

2017-04-16 17:42:39 2358

原创 29-TCP 协议(持续定时器)

1. 持续定时器在我们学习滑动窗口协议的时,遇到过窗口大小为 0 的情况。接收方通告一个 0 窗口给接收方,可以用来阻止发送方继续发送数据。如果在某个时候,接收方缓冲区有空间了,于是发送了一个非 0 窗口的通告给接收方,不幸的是这个通告丢失了,而发送方却还在死等接收方的非 0 窗口通告,接下来就成了死锁。为了防止这种情况,发送方只要接收到了 0 窗口通告,就开启一个持续定时器(persist tim

2017-04-16 17:20:17 1790

原创 28-TCP 协议(超时与重传)

TCP 超时与重传应该是 TCP 最复杂的部分之一了。Windows 和 Linux 对这部分的实现还有所不同,但是算法基本上还是差不多的。超时重传是 TCP 保证可靠传输的基础。当 TCP 在发送数据时,数据和 ack 都有可能会丢失,因此,TCP 通过在发送时设置一个定时器来解决这种问题。如果定时器溢出还没有收到确认,它就重传数据。无论是 Windows 还是 Linux,关键之处就在于超时和

2017-04-16 16:16:16 5660 4

原创 27-TCP 协议(快重传与快恢复)

很遗憾的是,这里一节我没办法用实验演示给你看,但是我尽量用文字和图叙述清楚。慢启动和拥塞避免算法是在 1988 年提出的,而快重传和快恢复是 1990 年提出的。既然这两个新算法是时隔两年后才提出的,那么它一定是对慢启动和拥塞避免算法的不足之处进行了改良。在此之前,先来回忆一下,发送方如何判定网络产生拥塞?已知的一种情况是对方回复 ack 超时。其实还有一种情况,如果发送方连续收到接收方多

2017-04-15 16:35:12 11001 6

EasyDraw 3.0(事故树绘制)

EasyDraw 事故树软件,3.0 版本,完全免费。排版更加精致,支持生成 svg 矢量图,png/jpeg 图形。

2018-11-02

GCC 内联汇编

gcc 内联汇编 1 AT&T 与 INTEL 的汇编语言语法的区别 1.1 大小写 1.2 操作数赋值方向 1.3 前缀 1.4 间接寻址语法 1.5 后缀 1.6 指令 2 GCC 内嵌汇编 2.1 简介 2.2 内嵌汇编举例 2.3 语法 2.3.1 汇编语句模板 2.3.2 输出部分 2.3.3 输入部分 2.3.4 限制字符 2.3.5 破坏描述部分 2.4GCC 如何编译内嵌汇编代码

2018-10-28

k近邻_kd-tree_kd树_vs2008_C++代码

vs2008写的Kd树泛型算法,支持k近邻查询。

2014-12-15

梯度下降法VS2008_C++

梯度下降法完整的VS2008代码。博客地址:http://blog.csdn.net/q1007729991/article/details/40382071

2014-10-23

事故树绘制软件easydraw免费V2.19

免费版本的事故软件,实现所有计算功能,节点自动调整,建树判错等功能!支持导出图片。

2013-12-13

增强版事故树绘制与分析程序

1.完善建立事故树的过程 2.事故树节点自动排列,免去手工排列节点的烦恼 3.编号自动生成,免去手工编号的繁琐 4.自动检测是否有闭环回路,防止用户建立逻辑上错误的事故树 5.自动检测用户是否在一个事件下重复添加 6.相同事件下建立节点,会进行同步复制,提高建树效率 7.相同事件下删除节点,会进行同步删除 8.手工拖动节点时自动对齐 9.修改节点信息,所有相同节点进行同步修改 10.画布大小自定义 11.画布颜色,事件框颜色,门颜色,文字颜色可以自定义 12.完美的一键保存bmp图片功能 13.编码树与文字树一键切换 14.列出事件清单,方便用户一次性输入事件概率 15.完善顶上事件概率计算,提供最小割集逼近法,无重复基本事件计算法,首项近似法,以及事件状态组合法。 16.优化最小割集、径集算法,提高计算速度 17.结构重要度删除不必要的状态组合法,仅提供公式三计算结果 18.提高了概率重要度、关键重要度的计算精度

2013-04-19

事故树绘制分析软件

简单易用,功能其全的一个事故树绘制分析软件,用以计算最小割集,最小径集,顶上事件概率,概率重要度,结构重要度,临界重要度,计算方法可选。 计算的结果可以保存到本地txt文本文件,方便您复制到您需要的地方,给您的论文写作也会带来极大方便。概率计算提供一套精确算法,可以根据您所提供的数据计算出精确结果。当然您也可以选择近似算法,本软件提供首项近似法和平均近似法的计算结果,给您多种选则。软件非常简单易用,自己几分钟就可以学会,谢谢您的使用!

2012-12-17

MFC 音乐播放器

基本上实现了常用的播放功能,可以自动下一首,通过音量条控制音量,实现时间进度栏,实现将添加到列表的歌曲文件列表存储到本地,下次启动的时候依然还在,更多功能等待你的发觉,不要说分高,学习才是王道,尊重作者的劳动成果,花了两天时间写的。

2012-12-12

汇编_单片机_matlab_Multisim等

注意:此为TXT文档,里面都有下载地址,你所要下载的东东都在我的u115网盘里! 静态反汇编工具W32Dasm.rar 51单片机种子全.rar win7系统工具.rar matlab详细教程.rar Multisim教程.exe 中国象棋经典残局《适情雅趣》_0.1.exe UltraEdit-32_V16.20.0.1009_汉化版(30天免费使用).exe 精美PPT模板_2009.11.30.zip VC6.0简体中文企业版.rar

2010-11-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除