一种接收数据的处理方法、装置及存储介质与流程

文档序号:29080907发布日期:2022-03-02 00:01阅读:65来源:国知局
一种接收数据的处理方法、装置及存储介质与流程

1.本发明涉及软件开发领域,尤其涉及到一种接收数据的处理方法、装置及存储介质。


背景技术:

2.对接收数据的粘包及分包的处理是在网络数据传输过程中必不可少的处理环节,其设计的合理性是决定网络数据高并发、时效性的关键。粘包是指发送方发送的若干数据包到接收方接收时粘成一包,使得接收方的系统接收缓冲区中后一包数据的头紧接着前一包数据的尾。网络分包是指接收方接收到的单个数据包是不完整的,需要对接收到的多个包数据进行合并成一个完整的接收数据包。
3.相关技术中,接收方对于接收数据的处理,通常包括:将发送方发送的一包数据按结构字段,由接收方控制分多次接收及合并的方式,以得到完整的接收数据包。但现有的接收数据的处理方法虽然能一定程度避免粘包和分包,但存在不利于网络数据传输效率及实时性的弊端。


技术实现要素:

4.为了解决现有的接收数据的处理方法存在不利于网络数据传输效率及实时性的缺陷,本发明提供了一种接收数据的处理方法、装置及存储介质。
5.第一方面,为了解决上述技术问题,本发明提供了一种接收数据的处理方法,包括:
6.获取接收缓冲区的首个包开始标志所对应的包头结构数据;
7.从所述接收缓冲区中获取所述包头结构数据所对应的接收数据,获取所述包头结构数据中的包类型信息所对应的包处理任务节点,将所述接收数据拷贝至所述包处理任务节点;
8.获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包。
9.本发明的有益效果是:通过建立包处理任务节点以完成对接收数据的粘包及分包处理,能够快速得到完整的接收数据包,且不影响正常的网络数据接收,有利于提高网络数据传输效率及实时性。
10.进一步,所述获取所述包头结构数据中的包类型信息所对应的包处理任务节点,将所述接收数据拷贝至所述包处理任务节点,包括:
11.检测包处理任务列表中是否存在所述包头结构数据中的包类型信息所对应的第一包处理任务节点,若是,则将所述接收数据拷贝至所述第一包处理任务节点的数据末尾,若否,则在所述包处理任务列表中建立所述包类型信息所对应的第二包处理任务节点,将所述接收数据拷贝至所述第二包处理任务节点。
12.采用上述改进方案的有益效果是:根据包类型信息,能够建立不同接收数据包所
对应的包处理任务节点,从而能够基于包处理任务节点进行粘包或分包处理,快速完成对各个接收数据包的组包。
13.进一步,所述获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包之前,还包括:
14.获取所述包处理任务节点的第一数据长度信息;
15.判断所述第一数据长度信息与所述包头结构数据中的数据长度信息是否相同,若否,则将所述包头结构数据所对应的接收数据从所述接收缓冲区中删除,并转至获取接收缓冲区的首个包开始标志所对应的包头结构数据的步骤。
16.采用上述改进方案的有益效果是:通过包头结构数据中的数据长度信息,判断包处理任务节点是否完成组包,并对未完成组包的包处理任务节点继续进行处理,从而能够对包含半包的接收数据对应进行分包处理。
17.进一步,所述获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包之前,还包括:
18.当所述第一数据长度信息与所述包头结构数据中的数据长度信息相同时,对所述包处理任务节点作检验和校验,若校验不通过,则将所述包头结构数据所对应的接收数据从所述接收缓冲区中删除,并转至获取接收缓冲区的首个包开始标志所对应的包头结构数据的步骤。
19.采用上述改进方案的有益效果是:提高完成组包的包处理任务节点的数据可靠性。
20.进一步,所述获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包,包括:
21.获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包;
22.将所述包头结构数据所对应的接收数据包添加至任务处理列表;
23.建立多个线程对所述任务处理列表中的接收数据包进行数据包处理。
24.采用上述改进方案的有益效果是:将对接收数据的组包处理与后续对接收数据包的处理分开,实现组包处理与数据包处理的并发执行,使得组包处理无需等待数据包处理完成,有效提高对接收数据的处理效率。
25.进一步,所述获取所述包头结构数据中的包类型信息所对应的包处理任务节点之前,还包括:
26.判断所述包头结构数据中的包类型信息是否属于预设包类型信息,若否,则将所述包头结构数据所对应的接收数据从所述接收缓冲区中删除,并转至获取接收缓冲区的首个包开始标志所对应的包头结构数据的步骤。
27.采用上述改进方案的有益效果是:利用包类型信息对接收数据快速进行初步检查,如果包类型信息不在定义的范围内则直接丢弃,能够提高接收数据的可靠性和处理效率。
28.进一步,所述获取接收缓冲区的首个包开始标志所对应的包头结构数据之前,还包括:
29.建立接收缓冲区;
30.将系统接收缓冲区接收的数据顺序存储至所述接收缓冲区。
31.采用上述改进方案的有益效果是:由于只是内存之间拷贝数据,能够及时将系统缓冲区接收到的数据存储到新建的接收缓冲区中,保证数据接收及处理的实时性,且新接收到的数据会顺序添加到接收缓冲区的数据末尾,可以实现初步的接收数据的包组合,有效减少数据分包发送导致的包组合过程,提高处理效率。
32.进一步,所述获取接收缓冲区的首个包开始标志所对应的包头结构数据,包括:
33.检测所述接收缓冲区是否为空,若否,则基于所述接收缓冲区的数据的存储位置,对所述接收缓冲区的数据进行顺序查找,得到所述首个包开始标志所对应的包头结构数据。
34.采用上述改进方案的有益效果是:当接收缓冲区存在未处理的接收数据时,对接收数据进行顺序处理,确保组包的正常进行。
35.第二方面,本发明提供了一种接收数据的处理装置,包括获取模块、第一处理模块和第二处理模块;
36.所述获取模块,用于获取接收缓冲区的首个包开始标志所对应的包头结构数据;
37.所述第一处理模块,用于从所述接收缓冲区中获取所述包头结构数据所对应的接收数据,获取所述包头结构数据中的包类型信息所对应的包处理任务节点,将所述接收数据拷贝至所述包处理任务节点;
38.所述第二处理模块,用于获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包。
39.第三方面,本发明提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当所述指令在终端设备上运行时,使得所述终端设备执行如上所述的接收数据的处理方法的步骤。
附图说明
40.图1为本发明实施例提供的一种接收数据的处理方法的流程示意图;
41.图2为本发明实施例提供的数据包的结构示意图;
42.图3为本发明实施例提供的一种接收数据的处理装置的结构示意图。
具体实施方式
43.下列实施例是对本发明的进一步解释和补充,对本发明不构成任何限制。
44.以下结合附图描述本发明实施例的一种接收数据的处理方法。
45.参照图1所示,本发明提供了一种接收数据的处理方法,包括:
46.s1、获取接收缓冲区的首个包开始标志所对应的包头结构数据。
47.可以理解的是,粘包指发送方发送的若干包数据到接收方接收时粘成一包,导致接收方的系统接收缓冲区中后一包数据的头紧接着前一包数据的尾。出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。
48.发送方引起的粘包是由tcp协议本身造成的,tcp为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常tcp会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。接收方引起
的粘包是由于接收方先把收到的数据放在系统接收缓冲区,用户进程从系统接收缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。
49.需要说明的是,接收缓冲区存储的接收数据为从系统接收缓冲区中拷贝的数据,因此接收缓冲区存储的接收数据中包含发送方发送的数据包,该数据包可包括半包或独立且完整的一包数据。当系统接收缓冲区出现粘包时,该接收缓冲区将包含若干个数据包。
50.如图2所示,每个数据包由包头结构数据(包头)和包身数据组成,包开始标志存储于包头结构数据中,用于指示数据包的起始,可以设置为区别于包身数据的特征序列。
51.示例性地,将包开始标志设置为特征序列

0xaaaaaa’(其中,

0x’表示16进制数),建立包处理线程,对接收缓冲区顺序查找包开始标志,将查找到的第一个特征序列

0xaaaaaa’作为得到的首个包开始标志,从而确定接收数据中应被优先处理的数据包在接收缓冲区中的存储位置,并获取其对应的包头结构数据。
52.其中,包处理线程可存储至线程内新建的包头结构中,以使包处理线程在执行后续步骤时,能够直接从新建的包头结构中读取包头结构数据。
53.示例性地,对于队列结构的接收缓冲区,可以根据接收缓冲区的存储位置,从头查找接收数据以得到首个包开始标志,也可以对每个数据包的包开始标志编号,根据查找到的包开始标志的序号,确定当前的接收缓冲区的首个包开始标志。
54.可选的,在一个实施例中,所述获取接收缓冲区的首个包开始标志所对应的包头结构数据之前,还包括:
55.建立接收缓冲区;
56.将系统接收缓冲区接收的数据顺序存储至所述接收缓冲区。
57.可以理解的是,tcp协议用于进行端对端的数据传送,因此每个tcp连接在内核中都有一个用于发送数据的缓冲区和用于接收数据的缓冲区,tcp的全双工的工作模式以及tcp的流量(拥塞)控制便是依赖于这两个独立的缓冲区以及缓冲区的填充状态,所述系统接收缓冲区即为tcp连接在接收端的内核中的用于接收数据的缓冲区。
58.具体地,在该实施例中,首先在内存中新建较大的接收缓冲区,由建立的包接收线程对所述接收缓冲区进行数据的写操作。在进行写操作时,包接收线程用于将系统接收缓冲区接收到的数据实时且顺序地写入到所述接收缓冲区中,以使系统接收缓冲区新接收到的数据能够不断添加到接收缓冲区的数据末尾。
59.通过新建接收缓冲区,可以在将系统接收缓冲区中接收的数据包添加到新建的接收缓冲区的数据末尾时就实现了数据包的拼接,减少发送方对数据分包发送时,接收方产生的包组合过程,提高接收方对接收数据的处理效率,且由于包接收线程只是在内存之间拷贝数据,因此能够保证数据接收及处理的实时性。
60.可选的,所述获取接收缓冲区的首个包开始标志所对应的包头结构数据,包括:
61.检测所述接收缓冲区是否为空,若否,则基于所述接收缓冲区的数据的存储位置,对所述接收缓冲区的数据进行顺序查找,得到所述首个包开始标志所对应的包头结构数据。
62.具体地,在该实施例中,由包处理线程检测接收缓冲区是否为空,若是,则包处理
线程休眠1毫秒,同时包接收线程将系统接收缓冲区接收到的数据拷贝到接收缓冲区中,并在包处理线程停止休眠时,包接收线程进入休眠。
63.其中,包处理线程停止休眠时,会再次检测接收缓冲区是否为空,若缓冲区为空,则再次休眠1毫秒,同时包接收线程启动,直至接收缓冲区非空,也即是接收缓冲区存在接收数据时,由包处理线程对接收数据进行组包处理。
64.s2、从所述接收缓冲区中获取所述包头结构数据所对应的接收数据,获取所述包头结构数据中的包类型信息所对应的包处理任务节点,将所述接收数据拷贝至所述包处理任务节点。
65.其中,包类型信息用于指示接收数据中属于同一接收数据包的数据包,也即是说,发送方对同一消息对应的数据包进行分包发送时,应对分包发送的数据包设置相同的包类型信息,且对不同消息对应的数据包,在进行分包时应对应设置不同的包类型信息。
66.可选的,在一个实施例中,所述获取所述包头结构数据中的包类型信息所对应的包处理任务节点,将所述接收数据拷贝至所述包处理任务节点,包括:
67.检测包处理任务列表中是否存在所述包头结构数据中的包类型信息所对应的第一包处理任务节点,若是,则将所述接收数据拷贝至所述第一包处理任务节点的数据末尾,若否,则在所述包处理任务列表中建立所述包类型信息所对应的第二包处理任务节点,将所述接收数据拷贝至所述第二包处理任务节点。
68.可以理解的是,包处理任务列表用于记录建立的包处理任务节点,对于完成组包的包处理任务节点,可以从包处理任务列表中删除,以提高包处理任务节点的查找效率。
69.示例性地,当接收缓冲区中的数据为半包时,对于初次接收的半包a建立包处理任务节点c,并根据半包a的包头结构数据中记录的包长度信息,将半包a拷贝至包处理任务节点c,当接收到半包b时,根据包类型信息判断半包b是否与半包a对应,若是,则找到包处理任务节点c,并将半包b拷贝至包处理任务节点c中半包a的末尾,以完成数据拼接,实现分包处理。
70.数据包d、数据包e和数据包f为三个完整数据包,在系统接收缓冲区中,数据包e的包头结构数据位于数据包d的数据末尾,数据包f的包头结构数据位于数据包e的数据末尾,形成粘包。
71.将数据包d、数据包e和数据包f组成的粘包数据从系统接收缓冲区拷贝至新建的接收缓冲区中。获取接收缓冲区中的首个包开始标志,得到数据包d所对应的包头结构数据,对数据包d建立包处理任务节点g,将数据包d拷贝至包处理任务节点g,从而将数据包d从粘包数据中分离。
72.从接收缓冲区中删除该数据包d,对数据包e和数据包f重复上述对数据包d的处理步骤,得到分别存储有数据包e和数据包f的包处理任务节点h和包处理任务节点i,从而将数据包d、数据包e和数据包f从粘包数据中分离,实现粘包处理。
73.可选的,在一个实施例中,所述获取所述包头结构数据中的包类型信息所对应的包处理任务节点之前,还包括:
74.判断所述包头结构数据中的包类型信息是否属于预设包类型信息,若否,则将所述包头结构数据所对应的接收数据从所述接收缓冲区中删除,并转至获取接收缓冲区的首个包开始标志所对应的包头结构数据的步骤。
75.可以理解的是,包类型信息可用于表示数据包的类型,利用包类型信息对接收数据快速进行初步检查,如果包类型信息不在定义的包类型的范围内则直接丢弃,能够提高接收数据的可靠性和处理效率。
76.示例性地,将tcp数据包作为定义的包类型,得到预设包类型信息,当包处理线程对udp数据包进行处理时,将判定该udp数据包的包类型信息不属于预设包类型信息(tcp数据包),则包处理线程将该udp数据包从接收缓冲区中删除,以避免对udp数据包进行错误的粘包或分包处理,并重新获取接收缓冲区的首个包开始标志所对应的包头结构数据,以进行新一轮的组包处理过程。
77.其中,在将udp数据包从接收缓冲区中删除时,可采用将接收缓冲区中的全部数据向左移动udp数据所对应的数据位数的方式,以避免破坏接收缓冲区的队列结构。
78.s3、获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包。
79.其中,该接收数据包为能够表示发送方所发送的单个消息的完整数据包,对出现粘包的接收缓存区,可从完成数据拷贝的包处理任务节点中直接获取包头结构数据所对应的接收数据包,而对于接收缓存区接收的多个半包,先基于首个包开始标志对应的半包建立包处理任务节点,并将具有相同包类型信息的半包作为包头结构数据所对应的接收数据,也即是将接收缓冲区的多个半包一次性拷贝至包处理任务节点,从而能够从完成数据拷贝的包处理任务节点中得到包头结构数据所对应的接收数据包,实现分包及粘包处理。
80.可选的,在一个实施例中,所述获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包之前,还包括:
81.获取所述包处理任务节点的第一数据长度信息;
82.判断所述第一数据长度信息与所述包头结构数据中的数据长度信息是否相同,若否,则将所述包头结构数据所对应的接收数据从所述接收缓冲区中删除,并转至获取接收缓冲区的首个包开始标志所对应的包头结构数据的步骤。
83.具体地,在该实施例中,第一数据长度信息为包处理任务节点存储的数据的数据长度,包头结构数据中的数据长度信息为包头结构数据所对应的接收数据包的数据长度,基于数据长度信息,能够快速判断出包处理任务节点是否完成组包,并对未完成组包的包处理任务节点继续进行处理,从而能够对包含半包的接收数据进行分包处理。
84.可选的,在一个实施例中,所述获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包之前,还包括:
85.当所述第一数据长度信息与所述包头结构数据中的数据长度信息相同时,对所述包处理任务节点作检验和校验,若校验不通过,则将所述包头结构数据所对应的接收数据从所述接收缓冲区中删除,并转至获取接收缓冲区的首个包开始标志所对应的包头结构数据的步骤。
86.示例性地,检验和校验的过程,包括:
87.将包处理任务节点的数据(包括包头结构数据中的检验和信息)按发送方生成检验和的计算方式进行计算,得到计算结果,例如发送方和接收方可采用对数据进行1的补码和运算,将累加的结果再取反码的计算方式进行检验和的计算;
88.如果计算结果为0,则校验通过,否则校验不通过。
89.其中,采用包类型和检验和校验的方式进行数据检验,能够保证接收数据包的正确性,且首先进行数据包类型判断,如果不在定义的范围内则直接丢弃,再利用检验和校验进行二次校验,能够降低使用检验和校验对接收数据处理速度的影响。
90.在一种可能的实施方式中,可将检验和校验不通过的包处理任务节点从包处理任务列表中删除。
91.可选的,在一个实施例中,所述获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包,包括:
92.获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包;
93.将所述包头结构数据所对应的接收数据包添加至任务处理列表;
94.建立多个线程对所述任务处理列表中的接收数据包进行数据包处理。
95.其中,任务处理列表用于记录完成组包的接收数据包,数据包处理包括数据包解析等任务处理过程。
96.可以理解的是,通常任务处理速度要比包处理速度慢得多,若在同一个线程中执行对接收数据的处理,由于包处理需要等待任务处理完成,因此会严重拖延包处理速度。
97.而通过采用分别开启包处理线程和任务处理线程的方式,可以根据处理量规模开启多个线程或建立线程池并行处理,同时可采用加同步锁的方式,例如保证多线程的正常执行情况,从而充分利用服务器资源实现高效处理,提高网络数据传输的吞吐量。
98.示例性地,可通过加/解锁接收缓冲区,以避免包接收线程对接收缓冲区的数据写入未完成时,包处理线程从接收缓冲区中错误读取数据,并通过加/解锁任务处理列表,以避免包处理线程和任务处理线程对任务处理列表的同步添加和移除节点冲突。
99.上述实施例提供的一种接收数据的处理方法,采用接收缓冲区、包接收线程、包处理线程、任务处理线程、数据同步锁、队列等多种技术结合,各个步骤紧密衔接、协同运行,有效解决网络数据传输中粘包及分包问题,提高对接收数据的处理效率,进而提高了数据传输的效率和可靠性。
100.在上述各实施例中,虽然对步骤进行了编号,如s1、s2等,但只是本技术给出的具体实施例,本领域的技术人员可根据实际情况调整s1、s2等的执行顺序,此也在本发明的保护范围内,可以理解,在一些实施例中,可以包含如上述各实施方式中的部分或全部。
101.如图3所示,本发明实施例提供的一种接收数据的处理装置10,包括获取模块20、第一处理模块30和第二处理模块40;
102.所述获取模块20,用于获取接收缓冲区的首个包开始标志所对应的包头结构数据;
103.所述第一处理模块30,用于从所述接收缓冲区中获取所述包头结构数据所对应的接收数据,获取所述包头结构数据中的包类型信息所对应的包处理任务节点,将所述接收数据拷贝至所述包处理任务节点;
104.所述第二处理模块40,用于获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包。
105.采用上述接收数据的处理装置,通过建立包处理任务节点以完成对接收数据的粘包及分包处理,能够快速得到完整的接收数据包,且不影响正常的网络数据接收,有利于提
高网络数据传输效率及实时性。
106.可选的,在一个实施例中,所述第一处理模块30,具体用于检测包处理任务列表中是否存在所述包头结构数据中的包类型信息所对应的第一包处理任务节点,若是,则将所述接收数据拷贝至所述第一包处理任务节点的数据末尾,若否,则在所述包处理任务列表中建立所述包类型信息所对应的第二包处理任务节点,将所述接收数据拷贝至所述第二包处理任务节点。
107.可选的,在一个实施例中,还包括判断模块;
108.所述判断模块,用于获取所述包处理任务节点的第一数据长度信息;
109.判断所述第一数据长度信息与所述包头结构数据中的数据长度信息是否相同,若否,则将所述包头结构数据所对应的接收数据从所述接收缓冲区中删除,并转至获取接收缓冲区的首个包开始标志所对应的包头结构数据的步骤。
110.优选地,所述判断模块,还用于当所述第一数据长度信息与所述包头结构数据中的数据长度信息相同时,对所述包处理任务节点作检验和校验,若校验不通过,则将所述包头结构数据所对应的接收数据从所述接收缓冲区中删除,并转至获取接收缓冲区的首个包开始标志所对应的包头结构数据的步骤。
111.可选的,在一个实施例中,所述第二处理模块40,具体用于获取所述包处理任务节点中存储的数据,得到所述包头结构数据所对应的接收数据包;将所述包头结构数据所对应的接收数据包添加至任务处理列表;建立多个线程对所述任务处理列表中的接收数据包进行数据包处理。
112.可选的,在一个实施例中,所述第一处理模块30,还用于判断所述包头结构数据中的包类型信息是否属于预设包类型信息,若否,则将所述包头结构数据所对应的接收数据从所述接收缓冲区中删除,并转至获取接收缓冲区的首个包开始标志所对应的包头结构数据的步骤。
113.可选的,在一个实施例中,还包括包接收模块;
114.所述包接收模块,用于建立接收缓冲区;将系统接收缓冲区接收的数据顺序存储至所述接收缓冲区。
115.优选地,所述获取模块20,具体用于检测所述接收缓冲区是否为空,若否,则基于所述接收缓冲区的数据的存储位置,对所述接收缓冲区的数据进行顺序查找,得到所述首个包开始标志所对应的包头结构数据。
116.本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当所述指令在终端设备上运行时,使得所述终端设备执行如上所述的接收数据的处理方法的步骤。
117.所属技术领域的技术人员知道,本发明可以实现为装置、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:可以是完全的硬件、也可以是完全的软件(包括固件、驻留软件、微代码等),还可以是硬件和软件结合的形式,本文一般称为“电路”、“模块”或“系统”。此外,在一些实施例中,本发明还可以实现为在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可读的程序代码。
118.在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特
点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
119.尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1