第7章套接字编程_第1页
第7章套接字编程_第2页
第7章套接字编程_第3页
第7章套接字编程_第4页
第7章套接字编程_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TCP/IP—协议分析与应用编程第七章套接字编程主要内容客户机/服务器模型套接字概念套接字编程基础WinSock函数基于TCP的应用编程基于UDP的应用编程学习目标理解客户机/服务器模型的工作机理。掌握套接字的概念。掌握基于套接字的面向连接和无连接客户机/服务器程序的设计原理,了解相关的WinSockAPI函数。通过程序实例,了解基于TCP和UDP的程序设计方法。客户机/服务器模型客户机/服务器模型的工作流程客户机/服务器模型服务器程序特点一般启动后就一直处于运行状态,以等待客户机进程的请求;使用的端口往往是熟知端口,便于客户机进程连接请求;一般拥有较多的系统资源,以便及时响应各个客户机进程的请求;可以并行处理多个客户机进程的请求,但数目是有一定的限制;在通信时一般处于被动的一方,不需要知道客户机的IP地址和端口信息。套接字概念使用套接字通信示意图基于套接字的通信过程可以描述为:创建/打开套接字、向套接字收发数据、关闭套接字。套接字概念针对不同的通信需求,在TCP/IP中提供了3种不同套接字类型流套接字(SOCK_STREAM):用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议——TCP。这类套接字中,传输数据之前必须在两个应用进程之间建立一条通信连接,这就确保了参与通信的两个应用进程都是活动并且响应的。当连接建立之后,应用进程只要通过套接字向TCP层发送数据流,而另一个应用进程便可以接收到相应的数据流,它们不需要知道传输层是如何对数据流进行处理。特别需要注意的是通信连接必须显式建立。该套接字类型适合传输大量的数据,但不支持广播和多播方式。套接字概念针对不同的通信需求,在TCP/IP中提供了3种不同套接字类型(续)数据报套接字(SOCK_DGRAM):提供了一种无连接的服务,通信双方不需要建立任何显式连接,数据可以发送到指定的套接字,并且可以从指定的套接字接收数据。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。与数据报套接字相比,使用流式套接字是一个更为可靠的方法,但对于某些应用,建立一个显式连接所导致的系统开销是令人难以接收的,并且数据报套接字支持广播和多播方式。套接字概念针对不同的通信需求,在TCP/IP中提供了3种不同套接字类型(续)原始套接字(SOCK_RAW):与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP的数据,数据报套接字只能读取UDP的数据。使用原始套接字的主要目的是为了避开TCP/IP处理机制,被传送的数据包可以被直接传送给需要它的应用程序。因此,其主要是在编写自定义底层协议的应用程序时使用,例如各种不同的TCP/IP实用程序(如ping和arp)都使用原始套接字实现,也可以用来实现数据包捕捉分析等。套接字编程基础从应用编程角度来看,套接字就是TCP/IP网络编程接口的集合,它是应用程序与TCP/IP协议族通信的中间软件抽象层,其中包含了许多函数或例程,程序员可以用它们来开发网络应用程序套接字编程基础面向连接的客户机/服务器程序工作模型套接字编程基础面向连接的客户机/服务器程序工作模型服务器进程的五元组建立由socket函数确定所使用的协议。由bind函数实现与本地IP和端口号的绑定,即确定本地IP和端口号。由accept函数实现与远程IP地址和端口号的关联,即确定远程IP和端口号。客户机进程五元组建立由socket函数确定所使用的协议。由bind函数实现与本地IP和端口号的绑定,其中本地IP和端口号既可以显式指定也可以由系统自动确定。由connect函数实现与远程IP地址和端口号的关联,即确定远程IP和端口号。套接字编程基础无连接的客户机/服务器程序工作模型套接字编程基础无连接的客户机/服务器程序工作模型在编写无连接客户机/服务器模型的程序时,与面向连接不同:通信的一方可以不用bind函数绑定IP地址和端口,而由系统自动分配,但充当服务器的一方需事先绑定IP地址和端口。不绑定IP地址和端口的一方必须首先向绑定IP地址和端口的一方发送数据,即充当客户机进程。无连接应用进程也可以调用connect函数,但它不是用来向通信对方发出建立连接的请求,只是告诉内核并由内核保存,以便在数据传输过程中可以使用send和recv函数。在无连接的数据报传输过程中,虽然没有显式指定服务器方和客户机方,但是作为服务器的应用进程也必须先启动,否则客户机进程的请求传不到服务器进程;在无连接的数据传输过程中,客户和服务器进程无需事先建立通信连接,这样当发送数据时,发送方除了指定本地套接字的地址外,还需要指定接收方的套接字地址,即在数据收发过程中动态建立通信双方的通信连接。套接字编程基础常用的套接字API套接字编程基础套接字编程相关数据结构sockaddr数据结构用于保存套接字的地址信息,具体定义如下:structsockaddr{unsignedshortsa_family;charsa_data[14]};其中:sa_family:用于指定地址族,如果是TCP/IP通信,该值取PF_INET和AF_NET;sa_data:用于保存套接字的IP地址和端口号信息。套接字编程基础套接字编程相关数据结构sockaddr_in数据结构与sockaddr类似,该结构体定义如下:structsockaddr_in{shortintsin_family;unsignedshortintsin_port;structin_addrsin_addr;unsignedcharsin_zero[8];};其中:sin_family:用于指定地址族,如果是TCP/IP通信,该值取PF_INET和AF_NET;sin_port:套接字通信的端口号;sin_addr:通信的IP地址;sin_zero[8]:用以填充0,保持与structsockaddr同样大小。套接字编程基础套接字编程相关数据结构由于sockaddr数据结构与sockaddr_in数据结构的大小是相同的,指向sockaddr_in的指针可以通过强制转换,转换成指向sockaddr结构的指针。套接字编程基础网络字节顺序不同体系的CPU在内存中的数据存储往往存在差异。如Intel的x86系列处理器将低序字节存储在起始地址,而一些RISC架构的处理器,如IBM的370主机使用的PowerPC或Motorola公司生产的CPU,都将高序字节存储在起始位置。这两种不同的存储方式被称为低位优先(little-endian)和高位优先(big-endian)。对于网络上的字节表示法有一个标准——网络字节顺序,它与高位优先相同。以便于不同体系结构的计算机间的通信。WinSock函数WinSock是一个基于套接字模型的API,在MicrosoftWindows操作系统类中使用。它在Berkeley接口函数的基础之上,还增加了基于消息驱动机制的Windows扩展函数。WinSock函数套接字与通信连接的建立与关闭函数WSAStartup函数功能:用于初始化WinSock,即检查系统中是否有WindowsSockets的实现库。格式:intWSAStarup(WORDwVersionRequested,LPWSADATAlpWSAData);socket函数功能:为应用程序创建套接字。格式:SOCKETsocket(intaf,inttype,intprotocol);WinSock函数套接字与通信连接的建立与关闭函数bind函数功能:实现套接字与主机本地IP地址和端口号的绑定。格式:intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);listen函数功能:将套接字设定为侦听状态,准备接收由客户机进程发出的连接请求。格式:intlisten(SOCKETs,intbacklog);WinSock函数套接字与通信连接的建立与关闭函数connect函数功能:提出与一个服务器进程建立连接的请求,如果服务器进程接受请求,则服务器进程与客户机进程之间便建立一条通信连接。格式:intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);accept函数功能:接受由客户机进程调用connect函数发出的连接请求。格式:SOCKETaccept(SCOKETs,structsockaddrFAR*addr,intFAR*addrlen);WinSock函数套接字与通信连接的建立与关闭函数shutdown函数功能:关闭套接字读写通道,即停止套接字接收/传送的功能。格式:intshutdown(SOCKETs,inthow);closesocket函数功能:关闭套接字,释放与套接字关联的所有资源。格式:intclosesocket(SOCKETs);WinSock函数套接字与通信连接的建立与关闭函数WSACleanup函数功能:终止使用WinSock,释放为应用程序分配的相关资源。格式:intWSACleanup();WinSock函数数据传输函数recv函数功能:在已建立连接的套接字上接收数据。格式:intrecv(SOCKETs,charFAR*buf,intlen,intflags);recvfrom函数功能:在无连接的套接字上接收数据。格式:intrecvfrom(SOCKETs,charFAR*buf,intlen,intflags,structsocketaddrFAR*from,intFAR*fromlen);WinSock函数数据传输函数send函数功能:在已建立连接的套接字上发送数据。格式:intsend(SOCKETs,constcharFAR*buf,intlen,intflags);sendto函数功能:在无连接套接字上发送数据。格式:intsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen);WinSock函数其他相关函数htonl函数功能:将4字节主机字节顺序的数转换为网络字节顺序。格式:u_longhtonl(u_longhostlong);htons函数功能:将2字节主机字节顺序的数据转换为网络字节顺序。格式:u_shorthtons(u_shorthostshort);ntohl函数功能:4字节网络字节顺序的数转换为主机字节顺序。格式:u_longntohl(u_longnetlong);WinSock函数其他相关函数ntohs函数功能:将2字节网络字节顺序的数据转换为主机字节顺序。格式:u_shortntohs(u_shortnetshort

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论