第7章套接字编程.ppt

上传人:本田雅阁 文档编号:3131537 上传时间:2019-07-14 格式:PPT 页数:35 大小:552.03KB
返回 下载 相关 举报
第7章套接字编程.ppt_第1页
第1页 / 共35页
第7章套接字编程.ppt_第2页
第2页 / 共35页
第7章套接字编程.ppt_第3页
第3页 / 共35页
第7章套接字编程.ppt_第4页
第4页 / 共35页
第7章套接字编程.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

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

1、TCP/IP协议分析与应用编程,第七章 套接字编程,主要内容,客户机/服务器模型 套接字概念 套接字编程基础 WinSock函数 基于TCP的应用编程 基于UDP的应用编程,学习目标,理解客户机/服务器模型的工作机理。 掌握套接字的概念。 掌握基于套接字的面向连接和无连接客户机/服务器程序的设计原理,了解相关的WinSock API函数。 通过程序实例,了解基于TCP和UDP的程序设计方法。,客户机/服务器模型,客户机/服务器模型的工作流程,客户机/服务器模型,服务器程序特点 一般启动后就一直处于运行状态,以等待客户机进程的请求; 使用的端口往往是熟知端口,便于客户机进程连接请求; 一般拥有较

2、多的系统资源,以便及时响应各个客户机进程的请求; 可以并行处理多个客户机进程的请求,但数目是有一定的限制; 在通信时一般处于被动的一方,不需要知道客户机的IP地址和端口信息。,客户机/服务器模型,客户机程序特点 在需要服务器进程的服务时将向服务器进程请求服务,并建立通信连接,得到满足并完成处理后就终止通信连接; 使用向系统申请的临时端口与服务器进程进行通信,通信完成后将释放该端口; 拥有相对较少的系统资源; 在通信时属于主动的一方,需要事先知道服务器的IP地址和端口信息。,套接字概念,在网络中要全局地标识一个参与通信的进程,需要采用三元组:协议、主机IP地址、端口号。 要描述两个应用进程之间的

3、端到端的通信关联则需要一个五元组:协议、信源机IP地址、信源应用进程端口、信宿机IP地址、信宿应用进程端口。 套接字可以理解为通信连接的一端,其主要包括协议、主机IP地址和端口号。 将两个套接字连接到一起便可以在不同应用进程之间传递数据 套接字实现了对网络和传输层协议的封装,为应用进程之间的通信连接的建立、数据传输等通信过程提供了编程界面。,套接字概念,使用套接字通信示意图 基于套接字的通信过程可以描述为: 创建/打开套接字、向套接字收发数据、关闭套接字。,套接字概念,针对不同的通信需求,在TCP/IP中提供了3种不同套接字类型 流套接字(SOCK_STREAM):用于提供面向连接、可靠的数据

4、传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议TCP。这类套接字中,传输数据之前必须在两个应用进程之间建立一条通信连接,这就确保了参与通信的两个应用进程都是活动并且响应的。当连接建立之后,应用进程只要通过套接字向TCP层发送数据流,而另一个应用进程便可以接收到相应的数据流,它们不需要知道传输层是如何对数据流进行处理。特别需要注意的是通信连接必须显式建立。该套接字类型适合传输大量的数据,但不支持广播和多播方式。,套接字概念,针对不同的通信需求,在TCP/IP中提供了3种不同套接字类型(续) 数据报套接字(SO

5、CK_DGRAM):提供了一种无连接的服务,通信双方不需要建立任何显式连接,数据可以发送到指定的套接字,并且可以从指定的套接字接收数据。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。与数据报套接字相比,使用流式套接字是一个更为可靠的方法,但对于某些应用,建立一个显式连接所导致的系统开销是令人难以接收的,并且数据报套接字支持广播和多播方式。,套接字概念,针对不同的通信需求,在TCP/IP中提供了3种不同套

6、接字类型(续) 原始套接字(SOCK_RAW):与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP的数据,数据报套接字只能读取UDP的数据。使用原始套接字的主要目的是为了避开TCP/IP处理机制,被传送的数据包可以被直接传送给需要它的应用程序。因此,其主要是在编写自定义底层协议的应用程序时使用,例如各种不同的TCP/IP实用程序(如ping和arp)都使用原始套接字实现,也可以用来实现数据包捕捉分析等。,套接字编程基础,从应用编程角度来看,套接字就是TCP/IP网络编程接口的集合,它是应用程序与TCP

7、/IP协议族通信的中间软件抽象层,其中包含了许多函数或例程,程序员可以用它们来开发网络应用程序,套接字编程基础,面向连接的客户机/服务器程序工作模型,套接字编程基础,面向连接的客户机/服务器程序工作模型 服务器进程的五元组建立 由socket函数确定所使用的协议。 由bind函数实现与本地IP和端口号的绑定,即确定本地IP和端口号。 由accept函数实现与远程IP地址和端口号的关联,即确定远程IP和端口号。 客户机进程五元组建立 由socket函数确定所使用的协议。 由bind函数实现与本地IP和端口号的绑定,其中本地IP和端口号既可以显式指定也可以由系统自动确定。 由connect函数实现

8、与远程IP地址和端口号的关联,即确定远程IP和端口号。,套接字编程基础,无连接的客户机/服务器程序工作模型,套接字编程基础,无连接的客户机/服务器程序工作模型 在编写无连接客户机/服务器模型的程序时,与面向连接不同: 通信的一方可以不用bind函数绑定IP地址和端口,而由系统自动分配,但充当服务器的一方需事先绑定IP地址和端口。 不绑定IP地址和端口的一方必须首先向绑定IP地址和端口的一方发送数据,即充当客户机进程。 无连接应用进程也可以调用connect函数,但它不是用来向通信对方发出建立连接的请求,只是告诉内核并由内核保存,以便在数据传输过程中可以使用send和recv函数。 在无连接的数

9、据报传输过程中,虽然没有显式指定服务器方和客户机方,但是作为服务器的应用进程也必须先启动,否则客户机进程的请求传不到服务器进程; 在无连接的数据传输过程中,客户和服务器进程无需事先建立通信连接,这样当发送数据时,发送方除了指定本地套接字的地址外,还需要指定接收方的套接字地址,即在数据收发过程中动态建立通信双方的通信连接。,套接字编程基础,常用的套接字API,套接字编程基础,套接字编程相关数据结构 sockaddr数据结构用于保存套接字的地址信息,具体定义如下: struct sockaddr unsigned short sa_family; char sa_data14 ; 其中: sa_f

10、amily:用于指定地址族,如果是TCP/IP通信,该值取PF_INET和AF_NET; sa_data:用于保存套接字的IP地址和端口号信息。,套接字编程基础,套接字编程相关数据结构 sockaddr_in数据结构与sockaddr类似,该结构体定义如下: struct sockaddr_in short int sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero8; ; 其中: sin_family:用于指定地址族,如果是TCP/IP通信,该值取PF_INET和AF

11、_NET; sin_port:套接字通信的端口号; sin_addr:通信的IP地址; sin_zero8:用以填充0,保持与struct sockaddr同样大小。,套接字编程基础,套接字编程相关数据结构 由于sockaddr数据结构与sockaddr_in数据结构的大小是相同的,指向sockaddr_in的指针可以通过强制转换,转换成指向sockaddr结构的指针。,套接字编程基础,网络字节顺序 不同体系的CPU在内存中的数据存储往往存在差异。如Intel的x86系列处理器将低序字节存储在起始地址,而一些RISC架构的处理器,如IBM的370主机使用的PowerPC或Motorola公司生

12、产的CPU,都将高序字节存储在起始位置。这两种不同的存储方式被称为低位优先(little-endian)和高位优先(big-endian)。 对于网络上的字节表示法有一个标准网络字节顺序,它与高位优先相同。以便于不同体系结构的计算机间的通信。,WinSock函数,WinSock是一个基于套接字模型的API,在Microsoft Windows操作系统类中使用。它在Berkeley接口函数的基础之上,还增加了基于消息驱动机制的Windows扩展函数。,WinSock函数,套接字与通信连接的建立与关闭函数 WSAStartup函数 功能:用于初始化WinSock,即检查系统中是否有Windows

13、Sockets的实现库。 格式:int WSAStarup (WORD wVersionRequested, LPWSADATA lpWSAData); socket函数 功能:为应用程序创建套接字。 格式:SOCKET socket(int af,int type, int protocol);,WinSock函数,套接字与通信连接的建立与关闭函数 bind函数 功能:实现套接字与主机本地IP地址和端口号的绑定。 格式:int bind ( SOCKET s, const struct sockaddr FAR *name, int namelen ); listen函数 功能:将套接字设定

14、为侦听状态,准备接收由客户机进程发出的连接请求。 格式:int listen ( SOCKET s, int backlog );,WinSock函数,套接字与通信连接的建立与关闭函数 connect函数 功能:提出与一个服务器进程建立连接的请求,如果服务器进程接受请求,则服务器进程与客户机进程之间便建立一条通信连接。 格式:int connect ( SOCKET s, const struct sockaddr FAR *name, int namelen ); accept函数 功能:接受由客户机进程调用connect函数发出的连接请求。 格式:SOCKET accept ( SCOKE

15、T s, struct sockaddr FAR *addr, int FAR *addrlen );,WinSock函数,套接字与通信连接的建立与关闭函数 shutdown函数 功能:关闭套接字读写通道,即停止套接字接收/传送的功能。 格式:int shutdown ( SOCKET s, int how ); closesocket函数 功能:关闭套接字,释放与套接字关联的所有资源。 格式:int closesocket (SOCKET s );,WinSock函数,套接字与通信连接的建立与关闭函数 WSACleanup函数 功能:终止使用WinSock,释放为应用程序分配的相关资源。 格

16、式:int WSACleanup ();,WinSock函数,数据传输函数 recv函数 功能:在已建立连接的套接字上接收数据。 格式:int recv ( SOCKET s, char FAR *buf,int len, int flags ); recvfrom函数 功能:在无连接的套接字上接收数据。 格式:int recvfrom ( SOCKET s,char FAR *buf, int len, int flags,struct socketaddr FAR *from, int FAR *fromlen );,WinSock函数,数据传输函数 send函数 功能:在已建立连接的套接

17、字上发送数据。 格式:int send ( SOCKET s, const char FAR *buf, int len,int flags ); sendto函数 功能:在无连接套接字上发送数据。 格式:int sendto ( SOCKET s, const char FAR *buf, int len,int flags, const struct sockaddr FAR *to, int tolen );,WinSock函数,其他相关函数 htonl函数 功能:将4字节主机字节顺序的数转换为网络字节顺序。 格式:u_long htonl (u_long hostlong); hton

18、s函数 功能:将2字节主机字节顺序的数据转换为网络字节顺序。 格式:u_short htons (u_short hostshort); ntohl函数 功能:4字节网络字节顺序的数转换为主机字节顺序。 格式:u_long ntohl (u_long netlong);,WinSock函数,其他相关函数 ntohs函数 功能:将2字节网络字节顺序的数据转换为主机字节顺序。 格式:u_short ntohs(u_short netshort); inet_addr函数 功能:将点分十进制数表示的IP地址转换为网络字节顺序的IP地址。 格式:unsigned long inet_addr (const char* cp); inet_ntoa函数 功能:将网络字节顺序表示的IP地址转换为点分十进制数表示的IP地址。 格式:char* FAR inet_ntoa(struct in_addr in);,基于TCP的应用编程,实现步骤,基于TCP的应用编程,应用开发实例参见程序代码,基于UDP的应用编程,UDP应用程序流程图,基于UDP的应用编程,UDP应用程序实例参见代码,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1