第7章套接字编程

上传人:博****1 文档编号:584053511 上传时间:2024-08-30 格式:PPT 页数:35 大小:552.02KB
返回 下载 相关 举报
第7章套接字编程_第1页
第1页 / 共35页
第7章套接字编程_第2页
第2页 / 共35页
第7章套接字编程_第3页
第3页 / 共35页
第7章套接字编程_第4页
第4页 / 共35页
第7章套接字编程_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《第7章套接字编程》由会员分享,可在线阅读,更多相关《第7章套接字编程(35页珍藏版)》请在金锄头文库上搜索。

1、1TCP/IPTCP/IP协议分析与应用编程协议分析与应用编程第七章第七章 套接字编程套接字编程第第7 7章章 套套接接字字编编程程2主要内容主要内容客户机客户机/ /服务器模型服务器模型套接字概念套接字概念套接字编程基础套接字编程基础WinSockWinSock函数函数基于基于TCPTCP的应用编程的应用编程基于基于UDPUDP的应用编程的应用编程第第7 7章章 套套接接字字编编程程3学习目标学习目标理解客户机理解客户机/ /服务器模型的工作机理。服务器模型的工作机理。掌握套接字的概念。掌握套接字的概念。掌握基于套接字的面向连接和无连接客户机掌握基于套接字的面向连接和无连接客户机/ /服服务

2、器程序的设计原理,了解相关的务器程序的设计原理,了解相关的WinSock APIWinSock API函数。函数。通过程序实例,了解基于通过程序实例,了解基于TCPTCP和和UDPUDP的程序设计方的程序设计方法。法。第第7 7章章 套套接接字字编编程程4客户机客户机/ /服务器模型服务器模型客户机客户机/ /服务器模型的工作流程服务器模型的工作流程第第7 7章章 套套接接字字编编程程5客户机客户机/ /服务器模型服务器模型服务器程序特点服务器程序特点一般启动后就一直处于运行状态,以等待客户机进程一般启动后就一直处于运行状态,以等待客户机进程的请求;的请求;使用的端口往往是熟知端口,便于客户机

3、进程连接请使用的端口往往是熟知端口,便于客户机进程连接请求;求;一般拥有较多的系统资源,以便及时响应各个客户机一般拥有较多的系统资源,以便及时响应各个客户机进程的请求;进程的请求;可以并行处理多个客户机进程的请求,但数目是有一可以并行处理多个客户机进程的请求,但数目是有一定的限制;定的限制;在通信时一般处于被动的一方,不需要知道客户机的在通信时一般处于被动的一方,不需要知道客户机的IPIP地址和端口信息。地址和端口信息。第第7 7章章 套套接接字字编编程程6客户机客户机/ /服务器模型服务器模型客户机程序特点客户机程序特点在需要服务器进程的服务时将向服务器进程请求服务,在需要服务器进程的服务时

4、将向服务器进程请求服务,并建立通信连接,得到满足并完成处理后就终止通信并建立通信连接,得到满足并完成处理后就终止通信连接;连接;使用向系统申请的临时端口与服务器进程进行通信,使用向系统申请的临时端口与服务器进程进行通信,通信完成后将释放该端口;通信完成后将释放该端口;拥有相对较少的系统资源;拥有相对较少的系统资源;在通信时属于主动的一方,需要事先知道服务器的在通信时属于主动的一方,需要事先知道服务器的IPIP地址和端口信息。地址和端口信息。第第7 7章章 套套接接字字编编程程7套接字概念套接字概念在网络中要全局地标识一个参与通信的进程,需在网络中要全局地标识一个参与通信的进程,需要采用三元组:

5、协议、主机要采用三元组:协议、主机IPIP地址、端口号。地址、端口号。要描述两个应用进程之间的端到端的通信关联则要描述两个应用进程之间的端到端的通信关联则需要一个五元组:协议、信源机需要一个五元组:协议、信源机IPIP地址、信源应地址、信源应用进程端口、信宿机用进程端口、信宿机IPIP地址、信宿应用进程端口。地址、信宿应用进程端口。套接字可以理解为通信连接的一端,其主要包括套接字可以理解为通信连接的一端,其主要包括协议、主机协议、主机IPIP地址和端口号。地址和端口号。将两个套接字连接到一起便可以在不同应用进程将两个套接字连接到一起便可以在不同应用进程之间传递数据之间传递数据套接字实现了对网络

6、和传输层协议的封装,为应套接字实现了对网络和传输层协议的封装,为应用进程之间的通信连接的建立、数据传输等通信用进程之间的通信连接的建立、数据传输等通信过程提供了编程界面。过程提供了编程界面。第第7 7章章 套套接接字字编编程程8套接字概念套接字概念使用套接字通信示意图使用套接字通信示意图基于套接字的通信过程可以描述为:基于套接字的通信过程可以描述为: 创建创建/ /打开打开套接字、向套接字收发数据、关闭套接字。套接字、向套接字收发数据、关闭套接字。第第7 7章章 套套接接字字编编程程9套接字概念套接字概念针对不同的通信需求,在针对不同的通信需求,在TCP/IPTCP/IP中提供了中提供了3 3

7、种不种不同套接字类型同套接字类型流套接字(流套接字(SOCK_STREAMSOCK_STREAM):用于提供面向连接、可):用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制够实现可靠的数据服务,原因在于其使用了传输控制协议协议TCPTCP。这类套接字中,传输数据之前必须在。这类套接字中,传输数据之前必须在两个应用进程之间建立一条通信连接,这就确保了参两个应用进程之间建立一条通信连接,这就确保了参

8、与通信的两个应用进程都是活动并且响应的。当连接与通信的两个应用进程都是活动并且响应的。当连接建立之后,应用进程只要通过套接字向建立之后,应用进程只要通过套接字向TCPTCP层发送数层发送数据流,而另一个应用进程便可以接收到相应的数据流,据流,而另一个应用进程便可以接收到相应的数据流,它们不需要知道传输层是如何对数据流进行处理。特它们不需要知道传输层是如何对数据流进行处理。特别需要注意的是通信连接必须显式建立。该套接字类别需要注意的是通信连接必须显式建立。该套接字类型适合传输大量的数据,但不支持广播和多播方式。型适合传输大量的数据,但不支持广播和多播方式。第第7 7章章 套套接接字字编编程程10

9、套接字概念套接字概念针对不同的通信需求,在针对不同的通信需求,在TCP/IPTCP/IP中提供了中提供了3 3种不种不同套接字类型(续)同套接字类型(续)数据报套接字(数据报套接字(SOCK_DGRAMSOCK_DGRAM):提供了一种无连接的):提供了一种无连接的服务,通信双方不需要建立任何显式连接,数据可以服务,通信双方不需要建立任何显式连接,数据可以发送到指定的套接字,并且可以从指定的套接字接收发送到指定的套接字,并且可以从指定的套接字接收数据。该服务并不能保证数据传输的可靠性,数据有数据。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证可能在传输过

10、程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用顺序地接收到数据。数据报套接字使用UDPUDP进行数据进行数据的传输。由于数据包套接字不能保证数据传输的可靠的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。与数据报套接字相比,使用流式套接做相应的处理。与数据报套接字相比,使用流式套接字是一个更为可靠的方法,但对于某些应用,建立一字是一个更为可靠的方法,但对于某些应用,建立一个显式连接所导致的系统开销是令人难以接收的,并个显式连接所导致的系统开销是令人难以接收的,并且数据报套

11、接字支持广播和多播方式。且数据报套接字支持广播和多播方式。第第7 7章章 套套接接字字编编程程11套接字概念套接字概念针对不同的通信需求,在针对不同的通信需求,在TCP/IPTCP/IP中提供了中提供了3 3种不种不同套接字类型(续)同套接字类型(续)原始套接字(原始套接字(SOCK_RAWSOCK_RAW):与标准套接字(标准套接):与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的别在于:原始套接字可以读写内核没有处理的IPIP数据数据包,而流套接字只能读取包,而流套接字只能读取TCPT

12、CP的数据,数据报套接字的数据,数据报套接字只能读取只能读取UDPUDP的数据。使用原始套接字的主要目的是的数据。使用原始套接字的主要目的是为了避开为了避开TCP/IPTCP/IP处理机制,被传送的数据包可以被直处理机制,被传送的数据包可以被直接传送给需要它的应用程序。因此,其主要是在编写接传送给需要它的应用程序。因此,其主要是在编写自定义底层协议的应用程序时使用,例如各种不同的自定义底层协议的应用程序时使用,例如各种不同的TCP/IPTCP/IP实用程序(如实用程序(如pingping和和arparp)都使用原始套接字)都使用原始套接字实现,也可以用来实现数据包捕捉分析等。实现,也可以用来实

13、现数据包捕捉分析等。第第7 7章章 套套接接字字编编程程12套接字编程基础套接字编程基础从应用编程角度来看,套接字就是从应用编程角度来看,套接字就是TCP/IPTCP/IP网络编网络编程接口的集合,它是应用程序与程接口的集合,它是应用程序与TCP/IPTCP/IP协议族通协议族通信的中间软件抽象层,其中包含了许多函数或例信的中间软件抽象层,其中包含了许多函数或例程,程序员可以用它们来开发网络应用程序程,程序员可以用它们来开发网络应用程序第第7 7章章 套套接接字字编编程程13套接字编程基础套接字编程基础面向连接的客户机面向连接的客户机/ /服务器程序工作模型服务器程序工作模型第第7 7章章 套

14、套接接字字编编程程14套接字编程基础套接字编程基础面向连接的客户机面向连接的客户机/ /服务器程序工作模型服务器程序工作模型服务器进程的五元组建立服务器进程的五元组建立由由socketsocket函数确定所使用的协议。函数确定所使用的协议。由由bindbind函数实现与本地函数实现与本地IPIP和端口号的绑定,即确定和端口号的绑定,即确定本地本地IPIP和端口号。和端口号。由由acceptaccept函数实现与远程函数实现与远程IPIP地址和端口号的关联,地址和端口号的关联,即确定远程即确定远程IPIP和端口号。和端口号。客户机进程五元组建立客户机进程五元组建立由由socketsocket函数

15、确定所使用的协议。函数确定所使用的协议。由由bindbind函数实现与本地函数实现与本地IPIP和端口号的绑定,其中本和端口号的绑定,其中本地地IPIP和端口号既可以显式指定也可以由系统自动确和端口号既可以显式指定也可以由系统自动确定。定。由由connectconnect函数实现与远程函数实现与远程IPIP地址和端口号的关联,地址和端口号的关联,即确定远程即确定远程IPIP和端口号。和端口号。第第7 7章章 套套接接字字编编程程15套接字编程基础套接字编程基础无连接的客户机无连接的客户机/ /服务器程序工作模型服务器程序工作模型第第7 7章章 套套接接字字编编程程16套接字编程基础套接字编程基

16、础无连接的客户机无连接的客户机/ /服务器程序工作模型服务器程序工作模型在编写无连接客户机在编写无连接客户机/ /服务器模型的程序时,与面向连接不同:服务器模型的程序时,与面向连接不同:通信的一方可以不用通信的一方可以不用bindbind函数绑定函数绑定IPIP地址和端口,而由系统地址和端口,而由系统自动分配,但充当服务器的一方需事先绑定自动分配,但充当服务器的一方需事先绑定IPIP地址和端口。地址和端口。不绑定不绑定IPIP地址和端口的一方必须首先向绑定地址和端口的一方必须首先向绑定IPIP地址和端口的地址和端口的一方发送数据,即充当客户机进程。一方发送数据,即充当客户机进程。无连接应用进程

17、也可以调用无连接应用进程也可以调用connectconnect函数,但它不是用来向通函数,但它不是用来向通信对方发出建立连接的请求,只是告诉内核并由内核保存,信对方发出建立连接的请求,只是告诉内核并由内核保存,以便在数据传输过程中可以使用以便在数据传输过程中可以使用sendsend和和recvrecv函数。函数。在无连接的数据报传输过程中,虽然没有显式指定服务器方在无连接的数据报传输过程中,虽然没有显式指定服务器方和客户机方,但是作为服务器的应用进程也必须先启动,否和客户机方,但是作为服务器的应用进程也必须先启动,否则客户机进程的请求传不到服务器进程;则客户机进程的请求传不到服务器进程;在无连

18、接的数据传输过程中,客户和服务器进程无需事先建在无连接的数据传输过程中,客户和服务器进程无需事先建立通信连接,这样当发送数据时,发送方除了指定本地套接立通信连接,这样当发送数据时,发送方除了指定本地套接字的地址外,还需要指定接收方的套接字地址,即在数据收字的地址外,还需要指定接收方的套接字地址,即在数据收发过程中动态建立通信双方的通信连接。发过程中动态建立通信双方的通信连接。第第7 7章章 套套接接字字编编程程17套接字编程基础套接字编程基础常用的套接字常用的套接字APIAPI第第7 7章章 套套接接字字编编程程18套接字编程基础套接字编程基础套接字编程相关数据结构套接字编程相关数据结构soc

19、kaddrsockaddr数据结构用于保存套接字的地址信息,具体数据结构用于保存套接字的地址信息,具体定义如下:定义如下:structstruct sockaddrsockaddr unsigned short unsigned short sa_familysa_family; ; char sa_data14 char sa_data14;其中:其中:sa_familysa_family:用于指定地址族,如果是:用于指定地址族,如果是TCP/IPTCP/IP通信,通信,该值取该值取PF_INETPF_INET和和AF_NETAF_NET;sa_datasa_data:用于保存套接字的:用于

20、保存套接字的IPIP地址和端口号信息。地址和端口号信息。第第7 7章章 套套接接字字编编程程19套接字编程基础套接字编程基础套接字编程相关数据结构套接字编程相关数据结构sockaddr_insockaddr_in数据结构与数据结构与sockaddrsockaddr类似,该结构体定义如下类似,该结构体定义如下:structstruct sockaddr_insockaddr_in short short intint sin_familysin_family; ; unsigned short unsigned short intint sin_portsin_port; ; structstr

21、uct in_addrin_addr sin_addrsin_addr; ; unsigned char sin_zero8; unsigned char sin_zero8;其中其中:sin_familysin_family:用于指定地址族,如果是:用于指定地址族,如果是TCPTCP/IP/IP通信,该值取通信,该值取PF_INETPF_INET和和AF_NETAF_NET;sin_portsin_port:套接字通信的端口号:套接字通信的端口号;sin_addrsin_addr:通信的:通信的IPIP地址地址;sin_zero8sin_zero8:用以填充:用以填充0 0,保持与,保持与s

22、truct struct sockaddrsockaddr同样大小同样大小。第第7 7章章 套套接接字字编编程程20套接字编程基础套接字编程基础套接字编程相关数据结构套接字编程相关数据结构由于由于sockaddrsockaddr数据结构与数据结构与sockaddr_insockaddr_in数据结构的大数据结构的大小是相同的,指向小是相同的,指向sockaddr_insockaddr_in的指针可以通过强制的指针可以通过强制转换,转换成指向转换,转换成指向sockaddrsockaddr结构的指针结构的指针。第第7 7章章 套套接接字字编编程程21套接字编程基础套接字编程基础网络字节顺序网络字

23、节顺序不同体系的不同体系的CPUCPU在内存中的数据存储往往存在差异。在内存中的数据存储往往存在差异。如如IntelIntel的的x86x86系列处理器将低序字节存储在起始地址,系列处理器将低序字节存储在起始地址,而一些而一些RISCRISC架构的处理器,如架构的处理器,如IBMIBM的的370370主机使用的主机使用的PowerPCPowerPC或或MotorolaMotorola公司生产的公司生产的CPUCPU,都将高序字节存,都将高序字节存储在起始位置。这两种不同的存储方式被称为低位优储在起始位置。这两种不同的存储方式被称为低位优先(先(little-endianlittle-endia

24、n)和高位优先()和高位优先(big-endianbig-endian)。)。对于网络上的字节表示法有一个标准对于网络上的字节表示法有一个标准网络字节顺网络字节顺序序,它与高位优先相同,它与高位优先相同。以便于不同体系结构的计算以便于不同体系结构的计算机间的通信。机间的通信。第第7 7章章 套套接接字字编编程程22WinSockWinSock函数函数WinSockWinSock是一个基于套接字模型的是一个基于套接字模型的APIAPI,在,在Microsoft WindowsMicrosoft Windows操作系统类中使用。它在操作系统类中使用。它在BerkeleyBerkeley接口函数的基

25、础之上,还增加了基于消接口函数的基础之上,还增加了基于消息驱动机制的息驱动机制的WindowsWindows扩展函数。扩展函数。第第7 7章章 套套接接字字编编程程23WinSockWinSock函数函数套接字与通信连接的建立与关闭函数套接字与通信连接的建立与关闭函数WSAStartupWSAStartup函数函数功能:用于初始化功能:用于初始化WinSockWinSock,即检查系统中是否有,即检查系统中是否有WindowsWindows SocketsSockets的实现库的实现库。格式:格式:intint WSAStarupWSAStarup (WORD (WORD wVersionRe

26、questedwVersionRequested, , LPWSADATA LPWSADATA lpWSADatalpWSAData););socketsocket函数函数功能:为应用程序创建套接字功能:为应用程序创建套接字。格式:格式:SOCKET SOCKET socketsocket(intint af,intaf,int type, type, intint protocolprotocol); ;第第7 7章章 套套接接字字编编程程24WinSockWinSock函数函数套接字与通信连接的建立与关闭函数套接字与通信连接的建立与关闭函数bindbind函数函数功能:实现套接字与主机本地

27、功能:实现套接字与主机本地IPIP地址和端口号的绑地址和端口号的绑定。定。格式:格式:intint bind ( SOCKET s, const bind ( SOCKET s, const structstruct sockaddrsockaddr FAR *name, FAR *name, intint namelennamelen ); ); listenlisten函数函数功能:将套接字设定为侦听状态,准备接收由客户功能:将套接字设定为侦听状态,准备接收由客户机进程发出的连接请求机进程发出的连接请求。 格式:格式:intint listen ( SOCKET s, listen ( S

28、OCKET s, intint backlog ); backlog ); 第第7 7章章 套套接接字字编编程程25WinSockWinSock函数函数套接字与通信连接的建立与关闭函数套接字与通信连接的建立与关闭函数connectconnect函数函数功能:提出与一个服务器进程建立连接的请求,如功能:提出与一个服务器进程建立连接的请求,如果服务器进程接受请求,则服务器进程与客户机进果服务器进程接受请求,则服务器进程与客户机进程之间便建立一条通信连接程之间便建立一条通信连接。 格式:格式:intint connect ( SOCKET s, const connect ( SOCKET s, c

29、onst structstruct sockaddrsockaddr FAR *name, FAR *name, intint namelennamelen ); ); acceptaccept函数函数功能:接受由客户机进程调用功能:接受由客户机进程调用connectconnect函数发出的函数发出的连接请求连接请求。格式:格式:SOCKET accept ( SCOKET s, SOCKET accept ( SCOKET s, structstruct sockaddrsockaddr FAR * FAR *addraddr, , intint FAR * FAR *addrlenaddr

30、len ); );第第7 7章章 套套接接字字编编程程26WinSockWinSock函数函数套接字与通信连接的建立与关闭函数套接字与通信连接的建立与关闭函数shutdownshutdown函数函数功能:关闭套接字读写通道,即停止套接字接收功能:关闭套接字读写通道,即停止套接字接收/ /传送的功能传送的功能。 格式:格式:intint shutdown ( SOCKET s, shutdown ( SOCKET s, intint how ); how ); closesocketclosesocket函数函数功能:关闭套接字,释放与套接字关联的所有资源功能:关闭套接字,释放与套接字关联的所有

31、资源。格式:格式:intint closesocketclosesocket (SOCKET s ); (SOCKET s ); 第第7 7章章 套套接接字字编编程程27WinSockWinSock函数函数套接字与通信连接的建立与关闭函数套接字与通信连接的建立与关闭函数WSACleanupWSACleanup函数函数功能:终止使用功能:终止使用WinSockWinSock,释放为应用程序分配的,释放为应用程序分配的相关资源相关资源。格式:格式:intint WSACleanupWSACleanup (); ();第第7 7章章 套套接接字字编编程程28WinSockWinSock函数函数数据传

32、输函数数据传输函数recvrecv函数函数功能:在已建立连接的套接字上接收数据功能:在已建立连接的套接字上接收数据。格式:格式:intint recvrecv ( SOCKET s, char FAR * ( SOCKET s, char FAR *buf,intbuf,int lenlen, , intint flags ); flags );recvfromrecvfrom函数函数功能:在无连接的套接字上接收数据功能:在无连接的套接字上接收数据。 格式:格式:intint recvfromrecvfrom ( SOCKET ( SOCKET s,chars,char FAR * FAR *

33、bufbuf, , intint lenlen, , intint flags,structflags,struct socketaddrsocketaddr FAR FAR *from, *from, intint FAR * FAR *fromlenfromlen ); );第第7 7章章 套套接接字字编编程程29WinSockWinSock函数函数数据传输函数数据传输函数sendsend函数函数功能:在已建立连接的套接字上发送数据功能:在已建立连接的套接字上发送数据。 格式:格式:intint send ( SOCKET s, const char FAR send ( SOCKET s

34、, const char FAR * *bufbuf, , intint len,intlen,int flags ); flags ); sendtosendto函数函数功能:在无连接套接字上发送数据功能:在无连接套接字上发送数据。 格式:格式:intint sendtosendto ( SOCKET s, const char FAR ( SOCKET s, const char FAR * *bufbuf, , intint len,intlen,int flags, const flags, const structstruct sockaddrsockaddr FAR *to, FA

35、R *to, intint tolentolen ); );第第7 7章章 套套接接字字编编程程30WinSockWinSock函数函数其他相关函数其他相关函数htonlhtonl函数函数功能:将功能:将4 4字节主机字节顺序的数转换为网络字节字节主机字节顺序的数转换为网络字节顺序。顺序。格式:格式:u_longu_long htonlhtonl ( (u_longu_long hostlonghostlong););htonshtons函数函数功能:将功能:将2 2字节主机字节顺序的数据转换为网络字字节主机字节顺序的数据转换为网络字节顺序。节顺序。格式:格式:u_shortu_short h

36、tonshtons ( (u_shortu_short hostshorthostshort););ntohlntohl函数函数功能:功能:4 4字节网络字节顺序的数转换为主机字节顺字节网络字节顺序的数转换为主机字节顺序。序。格式:格式:u_longu_long ntohlntohl ( (u_longu_long netlongnetlong););第第7 7章章 套套接接字字编编程程31WinSockWinSock函数函数其他相关函数其他相关函数ntohsntohs函数函数功能:将功能:将2 2字节网络字节顺序的数据转换为主机字字节网络字节顺序的数据转换为主机字节顺序。节顺序。格式:格式:

37、u_shortu_short ntohs(u_shortntohs(u_short netshortnetshort););inet_addrinet_addr函数函数功能:将点分十进制数表示的功能:将点分十进制数表示的IPIP地址转换为网络字地址转换为网络字节顺序的节顺序的IPIP地址。地址。格式:格式:unsignedunsigned long long inet_addrinet_addr (const char* (const char* cp);cp);inet_ntoainet_ntoa函数函数功能:将网络字节顺序表示的功能:将网络字节顺序表示的IPIP地址转换为点分十地址转换为点

38、分十进制数表示的进制数表示的IPIP地址。地址。格式:格式:charchar* FAR * FAR inet_ntoa(structinet_ntoa(struct in_addrin_addr in);in);第第7 7章章 套套接接字字编编程程32基于基于TCPTCP的应用编程的应用编程实现步骤实现步骤第第7 7章章 套套接接字字编编程程33基于基于TCPTCP的应用编程的应用编程应用开发实例参见程序代码应用开发实例参见程序代码第第7 7章章 套套接接字字编编程程34基于基于UDPUDP的应用编程的应用编程UDPUDP应用程序流程图应用程序流程图第第7 7章章 套套接接字字编编程程35基于基于UDPUDP的应用编程的应用编程UDPUDP应用程序实例参见代码应用程序实例参见代码

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号