select函数介绍 使用方法

基于TCP网络编程常用函数收藏
基于TCP网络编程常用函数及功能:
函数名功能
bind
将socket与本机上的一个端口绑定,随后就可以在该端口监听服务
请求
connect
面向连接的客户程序使用connect函数来配置socket,并与远端
服务器建立一个TCP连接
listen listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处
理它们
accept accept()函数让服务器接受客户的连接请求
close停止在该socket上的任何数据操作
send数据发送函数
recv数据接收函数
socket函数说明:
所需头文件:sys/types.h sys/socket.h
函数功能:建立socket
函数原型:int socket(int domain,int type, int protocol)
函数传入值:
domain type protocol AF_INET:Ipv4协议
AF_INET6:Ipv6协议AF_LOCAL:UNIX域协议AF_ROUTE:路由套接字AF_KEY:密钥套接字SOCK_STREAM:字节数据流套接

SOCK_DGRAM:数据报套接字
SOCK_RAW:原始套接字
设为0,表示自动选择
函数返回值:若成功,返回socket描述符;若失败,则返回-1
备注:socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。

调用socke t函数时,socket执行体将建立一个socket,实际上“建立一个socket”意味着为一个soc
ket数据结构分配内存空间。

bind函数说明:
所需头文件:sys/socket.h
函数功能:将socket与本机上的一个端口绑定,随后就可以在该端口监听服务请求函数原型:int bind(int sockefd,struct sockaddr *my_addr, int addrlen)
函数传入值:
sockfd my_addr addrlen
调用socket函数返回的socket描述符
指向包含有本机IP地址及端口号等信息的
sockaddr类型的指针
指结构体长度sizeof(struct
sockaddr)
函数返回值:若成功,0;若失败,则返回-1
备注:通过调用socket函数返回一个socket描述符之后,在使用该socket进行网络传输以前,必须配置该socket。

面向连接的socket客户端通过调用connect函数,在soc ket数据结构中保存本地和远端信息。

无连接socket的客户端和服务端以及面向连接soc keet的服务端通过调用bind函数来配置本地信息。

connect函数说明:
所需头文件:sys/socket.h
函数功能:面向连接的客户程序使用connect函数来配置socket并与远端服务器建立一
个TCP连接
函数原型:int connect(int sockefd,struct sockaddr *serv_addr, int addrlen)
函数传入值:
sockfd serv_addr addrlen
调用socket函数返回的socket描述符指向包含有远端主机IP地址及端口号等信息的
sockaddr类型的指针
指结构体长度sizeof(struct
sockaddr)
函数返回值:若成功,0;若失败,则返回-1
备注:connect函数启动和远端主机的直接连接。

只有面向连接的客户程序使用sockeet 时,才需要将此sockeet与远端主机相连。

无连接协议从不建立直接连接,面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的请求。

listen函数说明:
所需头文件:sys/socket.h
函数功能:listen函数使socket处于被动监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理他们。

函数原型:int listen(int sockefd,int backlog)
函数传入值:
sockfd backlog
调用socket函数返回的socket描
述符
最大主机连接数
函数返回值:若成功,0;若失败,则返回-1
accept函数说明:
所需头文件:sys/socket.h
函数功能:accept函数让服务器接收客户的连接请求函数原型:int accept(int sockefd,void *addr, int *addrlen)
函数传入值:
sockfd addr addrlen
调用socket函数返回的socket描述发存放提出连接请求服务的主机的信息(某台主机
从某个端口发出该请求)
指向值为sizeof(struct
sockaddr_in)的整型函数返回值:若成功,0;若失败,则返回-1
备注:在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求
close函数说明:
所需头文件:sys/socket.h
函数功能:close函数停止在该socket上的任何数据操作
函数原型:int close(int sockefd)
函数传入值:
函数返回值:若成功,0;若失败,则返回-1。

合集下载

list对象中select的用法

list对象中select的用法

list对象中select的用法在编程中,List对象是一个常见的数据结构,它允许我们存储和处理一系列元素。

在某些情况下,我们需要从List对象中选择满足特定条件的元素。

这时,我们可以使用select方法。

本文将详细介绍List对象中select的用法,并通过实例演示来帮助大家更好地理解。

1.List对象概述List对象是一个有序的元素集合,它可以存储任意类型的元素。

在Python 中,List对象使用方括号[]表示,元素之间用逗号分隔。

List对象支持常见的操作,如添加、删除和修改元素等。

2.select用法介绍select方法在List对象中用于选择满足条件的元素。

它的语法如下:```pythonselect(function, iterable)```其中,function表示一个函数,用于判断元素是否满足条件;iterable表示一个可迭代对象,如List、Tuple等。

select方法会返回一个新列表,其中包含满足条件的元素。

如果不存在满足条件的元素,则返回空列表。

3.实例演示下面通过一个实例来演示如何使用select方法:```python# 创建一个整数列表umbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# 定义一个判断函数,用于筛选偶数def is_even(x):return x % 2 == 0# 使用select方法筛选偶数even_numbers = list(filter(is_even, numbers))print(even_numbers) # 输出:[2, 4, 6, 8, 10]```在这个例子中,我们首先创建了一个整数列表。

然后,定义了一个判断函数is_even,用于检查一个数是否为偶数。

接下来,我们使用select方法(这里使用了filter函数,它与select方法原理相似)筛选出满足条件的偶数。

最后,将筛选结果打印出来。

list对象中select的用法

list对象中select的用法

list对象中select的用法摘要:1.列表对象(list)介绍2.select 函数的作用3.select 函数的参数4.select 函数的返回值5.select 函数在实际应用中的例子正文:列表对象(list)是Python 中非常常用的数据结构,它是一个有序的元素集合,可以包含不同类型的元素。

在处理列表数据时,我们常常需要根据一定条件筛选出满足要求的元素,这时select 函数就派上用场了。

select 函数是列表对象的一个内置方法,用于根据指定条件筛选出满足要求的元素。

它的主要作用是对列表进行切片操作,返回一个新的列表,新列表中的元素满足给定的条件。

select 函数的参数主要包括以下几个:- 索引:用于指定筛选元素的范围,可以是整数或切片对象。

如果省略索引参数,则表示筛选整个列表。

- 条件:用于指定筛选元素的条件,可以是一个函数或一个lambda 表达式。

当条件为函数时,需要将函数的返回值作为参数传递给select 函数。

select 函数的返回值是一个新列表,包含满足条件的元素。

注意,返回的新列表是根据原始列表的切片操作得到的,因此返回值不会修改原始列表。

下面举一个实际应用的例子,假设我们有一个列表,包含了一些学生的姓名和年龄,现在我们想要筛选出年龄大于等于18 岁的学生:```pythonstudents = ["Alice", "Bob", "Charlie", "David", "Eva", "Frank"]aged_students = students.select(lambda x: x[1] >= 18)print(aged_students) # 输出:["Bob", "David", "Frank"]```在这个例子中,我们使用了lambda 表达式作为筛选条件,表示筛选出年龄大于等于18 岁的学生。

c语言select socket编程用法

c语言select socket编程用法

c语言select socket编程用法C语言是一种广泛使用的程序设计语言,其具有良好的可移植性、灵活性和高效性,所以在网络编程中也被广泛使用。

其中,select函数是常用的网络编程技术,本文将介绍C语言中如何使用select函数进行socket编程。

一、socket编程简介网络编程中,socket是一种通信机制,因此通常采用socket编程来实现网络协议。

socket编程的基本流程是:创建socket->绑定IP 和端口号->监听->接收连接->发送和接收数据->关闭连接->关闭socket。

在socket编程中,需要用到的库文件有sys/socket.h、netinet/in.h、arpa/inet.h等。

二、select函数介绍select函数是一种多路复用技术,通过它可以同时监视多个文件描述符的状态,当其中一个或多个文件描述符发生变化时,select函数就可以返回。

select函数的原型为:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout),参数说明如下:nfds:待检测的最大文件描述符加1。

readfds:可读文件描述符集合。

writefds:可写文件描述符集合。

exceptfds:异常文件描述符集合。

timeout:select函数在阻塞的时候,等待时间的长度。

select函数会在一定时间内阻塞等待,直到有文件描述符准备好或达到超时时间。

如果出现异常,select函数的返回值为-1,否则返回已准备好的文件描述符数量。

三、select函数的使用在使用select函数进行socket编程时,只需要将需要监控的socket加入到可读文件描述符集合中即可。

如下所示:1. 创建socket并绑定IP和端口号;2. listen函数将该socket设置为监听状态;3. 将该监听socket加入到可读文件描述符集合中;4. 使用select函数进行监控,并等待传入的连接请求;5. 当select函数返回,并且其中包含监听socket的可读集合,则调用accept函数接收连接请求。

网络编程——select介绍

网络编程——select介绍

⽹络编程——select介绍⼀、select函数简介 select⼀般⽤在socket⽹络编程中,在⽹络编程的过程中,经常会遇到许多阻塞的函数,⽹络编程时使⽤的recv, recvfrom、connect函数都是阻塞的函数,当函数不能成功执⾏的时候,程序就会⼀直阻塞在这⾥,⽆法执⾏下⾯的代码。

这是就需要⽤到⾮阻塞的编程⽅式,使⽤selcet函数就可以实现⾮阻塞编程。

selcet函数是⼀个轮循函数,即当循环询问⽂件节点,可设置超时时间,超时时间到了就跳过代码继续往下执⾏ select(),确定⼀个或多个套接⼝的状态,本函数⽤于确定⼀个或多个套接⼝的状态,对每⼀个套接⼝,调⽤者可查询它的可读性、可写性及错误状态信息,⽤fd_set结构来表⽰⼀组等待检查的套接⼝,在调⽤返回时,这个结构存有满⾜⼀定条件的套接⼝组的⼦集,并且select()返回满⾜条件的套接⼝的数⽬。

通常采⽤select实现多路复⽤,也就是说可以同时监听多个⽂件描述符;下⾯是select的函数原型:/* According to POSIX.1-2001 */2 #include <sys/select.h>34 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);下⾯进⾏具体的解释:第⼀个参数:int nfds--->是⼀个整数值,是指集合中所有⽂件描述符的范围,即所有⽂件描述符的最⼤值加1第⼆个参数:fd_set *readfds---->⽤来检查⼀组可读性的⽂件描述符。

第三个参数:fd_set *writefds---->⽤来检查⼀组可写性的⽂件描述符。

第四个参数:fd_set *exceptfds---->⽤来检查⽂件⽂件描述符是否异常第五个参数:sreuct timeval *timeout--->是⼀个时间结构体,⽤来设置超时时间timeout:最多等待时间,对阻塞操作则为NULLselect函数的返回值负值:select错误正值:表⽰某些⽂件可读或可写0:等待超时,没有可读写或错误的⽂件下⾯是⼀些跟select⼀起使⽤的函数及结构的作⽤void FD_CLR(int fd, fd_set *set);//清空⼀个⽂件描述符的集合int FD_ISSET(int fd, fd_set *set);//将⼀个⽂件描述符添加到⼀个指定的⽂件描述符集合中void FD_SET(int fd, fd_set *set);//将⼀个给定的⽂件描述符从集合中删除;void FD_ZERO(fd_set *set);//检查集合中指定的⽂件描述符是否可以读写 struct timeval结构是⽤来设置超时时间的,该结构体可以精确到秒跟毫秒struct timeval{time_t tv_sec; /* seconds */suseconds_t tv_usec; /* microseconds */}; 下⾯是select常⽤的⼀个例⼦:#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>int main(int argc, cahr **argv){struct timeval timeout;int ret = 0;fd_set rfds;FD_ZERO(&rfds);//清空描述符集合FD_SET(0, &rfds);//将标准输⼊(stdin)添加到集合中FD_SET(sockfd, &rfds);//将我们的套接字描述符添加到集合中/*设置超时时间*/_sec = 1;_usec = 0;/*监听套接字是否为可读*/ret = select(sockfd+1, &rfds, NULL, NULL, &timeout); if(ret == -1) {//select 连接失败perror("select failure\n");return 1;}else if(ret == 0) {//超时(timeout)return 1;}if(FD_ISSET(pesockfd, &rfds)) {//如果可读//recv or recvfrom..................}return 0;}。

linux 中select的基本用法

linux 中select的基本用法

linux 中select的基本用法深入了解Linux 中select 的基本用法导语:在Linux 中,select 是一个重要的系统调用,用于同时监视多个文件描述符的可读、可写和出错条件。

它是实现多路复用IO的一种常用方法,能够帮助提高系统的性能。

本文将介绍select 的基本用法,从基础概念到具体使用方法,一步一步讲解,帮助读者更好地理解和应用该系统调用。

第一部分:基础知识1. select 的定义和作用- select 是一个系统调用,用于在一组文件描述符上进行IO 复用- 它能够同时监视多个文件描述符,并在有可读、可写或出错事件发生时进行相应的处理- 使用select 可以减少系统资源的浪费,提高系统的性能2. 文件描述符- 在Linux 中,文件和设备都通过文件描述符来操作- 文件描述符是一个非负整数,用于标识一个打开的文件或设备- 标准输入、标准输出和标准错误输出的文件描述符分别为0、1 和23. fd_set 类型- fd_set 是用于表示文件描述符集合的数据类型- 它通过一个位图来表示文件描述符集合的状态,每个文件描述符占用一个位- 可以使用宏函数来操作fd_set,如FD_ZERO、FD_SET、FD_CLR 和FD_ISSET第二部分:使用步骤1. 初始化文件描述符集合- 使用FD_ZERO 宏函数将文件描述符集合清零- 使用FD_SET 宏函数将需要监视的文件描述符添加到集合中2. 设置超时时间- 声明并初始化timeval 结构体变量,用于指定select 的超时时间- 如果不需要设置超时时间,则将timeval 结构体中的字段都设为03. 调用select 函数- 调用select 函数并传入最大文件描述符数、可读文件描述符集合、可写文件描述符集合、出错文件描述符集合和超时时间- select 函数会阻塞进程,直到有事件发生或超时,返回时会修改文件描述符集合的状态4. 处理事件- 使用FD_ISSET 宏函数判断特定文件描述符是否在集合中- 根据返回的文件描述符集合的状态,进行相应的读、写或出错操作第三部分:注意事项和高级用法1. 最大文件描述符数- select 的第一个参数需要指定最大文件描述符数加1- 如果文件描述符超过了该值,在一些旧版本的Linux 中可能会导致select 函数调用失败2. 文件描述符集合的修改- 在调用select 函数后,文件描述符集合的状态会被修改,只保留了就绪的文件描述符- 因此,每次调用select 函数前都需要重新初始化文件描述符集合3. 非阻塞模式和异步通知- select 在默认情况下是阻塞的,即会一直等待事件发生- 可以通过将文件描述符设置为非阻塞模式来改变这一行为,使得select立即返回- 也可以使用其他方法,如信号处理和管道通信,实现异步通知机制4. poll 和epoll 函数- poll 和epoll 是select 的替代方案,可以更好地处理大量文件描述符- 它们采用事件驱动的方式,不需要每次都重新初始化文件描述符集合- 在需要处理大量并发连接的情况下,可以考虑使用poll 或epoll 函数结语:本文从基础知识到具体使用步骤,详细介绍了Linux 中select 的基本用法。

select 用法 -回复

select 用法 -回复

select 用法-回复如何正确使用select函数在编程语言中,select函数被广泛用于处理多个输入/输出(I/O)操作。

它提供了一种有效的方式来同时监视多个通信通道,如文件描述符、套接字等,并在其中任意一个通道可进行I/O操作时进行相应处理。

本文将一步一步回答如何正确使用select函数。

第一步:了解select函数的基本概念和用法select函数是一种在非阻塞I/O操作中等待多个文件描述符就绪的方法。

它接受三个参数,第一个参数是整数值nfds,表示待监视的最大文件描述符值加1;第二个参数是fd_set类型的指针readfds,用于设置待监视的文件描述符集合;第三个参数是fd_set类型的指针writefds和exceptfds,用于设置待监视的文件描述符的特殊条件集合。

第二步:理解fd_set类型fd_set类型是一种用于表示文件描述符集合的数据类型。

它是一种位图(bitmap),每个文件描述符都对应着fd_set中的一位。

可以使用宏函数FD_ZERO、FD_SET、FD_CLR和FD_ISSET来操作fd_set类型,分别用于将fd_set清空、向fd_set中添加文件描述符、从fd_set中删除文件描述符以及判断某个文件描述符是否在fd_set中。

第三步:设置待监视的文件描述符集合在调用select函数之前,需要先设置待监视的文件描述符集合。

可以使用FD_ZERO和FD_SET宏函数来清空和向fd_set中添加文件描述符。

例如,假设我们要同时监视文件描述符1和2,可以如下设置:fd_set readfds;FD_ZERO(&readfds);FD_SET(1, &readfds);FD_SET(2, &readfds);第四步:调用select函数进行监视设置完待监视的文件描述符集合后,就可以调用select函数进行监视。

调用select函数后,它将阻塞等待,直到集合中至少一个文件描述符可进行I/O操作。

linux中select、poll、epoll原理详解

linux中select、poll、epoll原理详解目录1. 引言1.1 背景和意义1.2 结构概述1.3 目的2. select原理详解2.1 基本概念2.2 使用方法2.3 应用场景3. poll原理详解3.1 基本概念3.2 使用方法3.3 应用场景4. epoll原理详解4.1 基本概念4.2 使用方法4.3 应用场景5. 结论5.1 对比分析选择合适的IO多路复用器5.2 总结与展望引言1.1 背景和意义在计算机网络编程中,同时监听多个文件描述符的可读、可写和异常事件是一项基本任务。

为了高效地处理这些事件,Linux提供了三种IO多路复用器:select、poll和epoll。

它们允许程序通过一次系统调用就能同时监听多个文件描述符,并在有可读、可写或异常事件发生时进行相应的处理。

使用IO多路复用器可以避免使用阻塞式IO或者轮询方式造成的性能损失,提高了程序的效率和响应速度。

尤其对于具有大量并发连接的服务器程序来说,选择合适的IO多路复用器可以极大地提升系统性能。

1.2 结构概述本文将详细解析Linux中三种IO多路复用器的原理和使用方法,包括select、poll和epoll。

对于每种IO多路复用器,我们将介绍其基本概念、使用方法以及适用场景。

通过深入理解这些IO多路复用器的工作原理,我们可以更好地掌握它们的特点及优缺点,并根据实际需求选择合适的方式来进行网络编程。

1.3 目的本文旨在帮助读者全面了解Linux中select、poll和epoll的原理和使用方法,以及它们在网络编程中的应用场景。

在深入理解这些IO多路复用器的基础上,读者可以根据实际需求灵活选择合适的IO多路复用器,提升程序的性能和可扩展性。

在接下来的文章中,我们将逐一介绍select、poll和epoll的原理详解、使用方法和应用场景,并进行对比分析,最后总结归纳各种IO多路复用器的特点及适用情况。

2. select原理详解2.1 基本概念在Linux系统中,select是一种常用的I/O多路复用机制,它可以监视多个文件描述符的状态是否满足某种条件,在有一或多个文件描述符就绪时通知进程进行相应的 I/O操作。

select()函数

(5)若fd=1,fd=2上都发生可读事件,则select返回,此时set变为0000,0011。注意:没有事件发生的fd=5被清空。
基于上面的讨论,可以轻松得出select模型的特点:
(1)可监控的文件描述符个数取决与sizeof(fd_set)的值。我这边服务 器上sizeof(fd_set)=512,每bit表示一个文件描述符,则我服务器上支持的最大文件描述符是512*8=4096。据说可调,另有说虽 然可调,但调整上限受于编译内核时的变量值。本人对调整fd_set的大小不太感兴趣,参考 /CppExplore/archive/2008/03/21/45061.html中的模型2(1)可以有效突破select可监控的文件描述符上限。
功能:
测试指定的fd可读?可写?有异常条件待处理?
参数:
nfds
需要检查的文件描述字个数(即检查到fd_set的第几位),数值应该比三组fd_set中所含的最大fd值更大,一般设为三组fd_set中所含的最大fd值加1(如在readset,writeset,exceptset中所含最大的fd为5,则nfds=6,因为fd是从0开始的)。设这个值是为提高效率,使函数不必检查fd_set的所有1024位。
FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。
FD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。
FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。
if(FD_ISSET(listen_fd,&set))
{
newfd=accept(listen_fd);

select基本用法 -回复

select基本用法-回复【select基本用法】,以中括号内的内容为主题,写一篇1500-2000字文章,一步一步回答在计算机编程中,select是一种重要的操作,用于多路复用输入/输出。

通过使用select,程序可以同时监听多个文件描述符,从而实现高效的IO 操作。

本文将介绍select的基本用法,包括select函数的使用和原理,以及一些常见的应用场景。

一、select函数的使用select函数是一个系统调用,用于在一组文件描述符上进行监视。

它的声明如下:cint select(int nfds, fd_set *readfds, fd_set *writefds, fd_set*exceptfds, struct timeval *timeout);函数的参数含义如下:- nfds:被监听的最大文件描述符值加一,例如,如果被监听的文件描述符范围是0到fdmax,那么nfds应该为fdmax+1。

- readfds:指向fd_set类型的指针,用来检查可读性,即是否有数据可读。

- writefds:指向fd_set类型的指针,用来检查可写性,即是否可以写入数据。

- exceptfds:指向fd_set类型的指针,用来检查异常情况,例如套接字错误。

- timeout:指向struct timeval类型的指针,用于设定select的超时时间。

在调用select函数之前,需要对fd_set类型的指针进行初始化,并添加要监听的文件描述符。

可以使用FD_ZERO和FD_SET宏来进行初始化和添加操作。

select函数会返回一个整数值,表示满足条件的文件描述符的个数。

如果返回值为0,则表示超时,没有满足条件的文件描述符;如果返回值为-1,则表示出错。

二、select函数的原理select函数的原理是通过轮询各个文件描述符的状态,以确定是否有可读、可写或异常事件发生。

内核会不断扫描每个文件描述符,如果有事件发生,则将其对应的文件描述符添加到相应的fd_set中。

go socket select用法

go socket select用法在计算机网络编程中,使用Socket作为通信接口是常见的实践之一。

而在进行Socket编程时,使用select函数可以提供一种高效的多路复用机制。

本文将详细介绍go语言中Socket编程的基本用法以及select函数的使用。

一、Socket概述Socket是一种提供网络通信能力的编程接口,它将网络通信的细节封装起来,通过在应用层与传输层之间建立连接,实现进程间的通信。

Socket编程在客户端和服务器端之间进行消息传递,允许两个或多个进程在同一主机上或者不同主机上进行通信。

二、go语言中的Socket编程1. 创建Socket在go语言中,可以使用`net`包来进行Socket编程。

通过调用`net.Listen()`方法可以创建一个Socket,开始监听某个端口,等待客户端的连接。

示例代码如下:```golistener, err := net.Listen("tcp", ":8080")if err != nil {fmt.Println("Error: ", err)}fmt.Println("Listening on port 8080")```2. 接受连接使用`Accept()`函数可以接受客户端的连接请求,并返回一个用于通信的Socket对象。

示例代码如下:```goconn, err := listener.Accept()if err != nil {fmt.Println("Error: ", err)}defer conn.Close()```3. 发送和接收数据通过`Read()`和`Write()`函数可以实现数据的发送和接收。

示例代码如下:```gobuf := make([]byte, 1024)len, err := conn.Read(buf)if err != nil {fmt.Println("Error: ", err)}fmt.Println("Received data: ", string(buf[:len]))data := []byte("Hello, client!")_, err = conn.Write(data)if err != nil {fmt.Println("Error: ", err)}```三、select函数的使用select函数是go语言提供的一种多路复用机制,它可以监听多个Socket的可读性、可写性和异常性,并从中选择一个可用的Socket进行操作。

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