unix-os教学-第九章 unix网络程序设计ppt课件_第1页
unix-os教学-第九章 unix网络程序设计ppt课件_第2页
unix-os教学-第九章 unix网络程序设计ppt课件_第3页
unix-os教学-第九章 unix网络程序设计ppt课件_第4页
unix-os教学-第九章 unix网络程序设计ppt课件_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

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

文档简介

1、v掌握:网络体系结构、地址标识等基础掌握:网络体系结构、地址标识等基础v了解:套接字的基本功能和作用了解:套接字的基本功能和作用v掌握:基本的套接字函数编程方法掌握:基本的套接字函数编程方法v掌握:客户端程序设计方法掌握:客户端程序设计方法v掌握:并行服务器程序的设计方法掌握:并行服务器程序的设计方法v通信子网通信子网v信息传输控制信息传输控制v信息流量控制信息流量控制v信息传递路径控制信息传递路径控制v资源子网资源子网v软件信息和数据信息的共享软件信息和数据信息的共享v硬件资源的共享硬件资源的共享v负载均衡的管理负载均衡的管理v计算机网络:把分布计算机网络:把分布在不同地理位置上的,在不同地

2、理位置上的,具有独立功能的多台具有独立功能的多台计算机、终端及其附计算机、终端及其附属设备,用通信设备属设备,用通信设备和通信线路连接起来,和通信线路连接起来,再配以相应的网络软再配以相应的网络软件,以实现计算机资件,以实现计算机资源共享。源共享。应用层表示层会话层传输层网络层数据链路层物理层应用层IPv4, IPv6网络介质层TCPUDPOSI模型TCP/IP模型FTP客户TCPIP以太网驱动程序FTP服务器TCPIP以太网驱动程序以太网驱动程序以太网驱动程序IPFTP协议TCP协议IP协议IP协议以太网客户服务器用户数据用户数据App头部用户数据TCP头部用户数据TCP头部IP头部用户数据

3、TCP头部IP头部以太网头部以太网尾部以太网帧401500字节FTP客户TCPIP以太网驱动程序TCP段IP分组掌握掌握IP地址与域名地址的关系地址与域名地址的关系v48位:位:24位位OUI,24位由厂商分配位由厂商分配v平面地址,无结构平面地址,无结构v全球唯一全球唯一v局部范围寻址局部范围寻址v存在于数据链路层存在于数据链路层局域网中,各个主机是以局域网中,各个主机是以MAC地址进行数据递交地址进行数据递交v IP地址标识着网络一个主机的位置。每个地址标识着网络一个主机的位置。每个IP地址都是由地址都是由32位或位或128位组成,分成两部分:网络号、主机号。位组成,分成两部分:网络号、主

4、机号。v 全球唯一,寻址容易全球唯一,寻址容易v 两种表示形式:二进制计算机内部)、点分十进制两种表示形式:二进制计算机内部)、点分十进制A类地址A类地址18162432B类地址B类地址C类地址C类地址D类地址D类地址E类地址E类地址主机地址范围到到5555到到5555到到5555到到239.255.255

5、.25555到到55550网络地址(7 位 )主机地址(2 4 位)10网络地址(1 4 位)主机地址(1 6 位)110网络地址(2 1 位)主机地址(8 位 )1110多目的广播地址(2 8 位)11110保留用于实验和将来使用processprocessprocessprocessprocessprocessIP地址平面vTCP和和UDP使用使用16位的端口号用无符号整型表位的端口号用无符号整型表示)示)v为防止端口使用的混乱,将端口分为以下三类:为防止端口使用的混乱,将端口

6、分为以下三类:v“众所周知的端口:众所周知的端口:01023,由,由IANA统一控制统一控制v注册的端口:注册的端口:102449151,这些端口虽不由,这些端口虽不由IANA控制,但控制,但IANA登记这些端口的使用登记这些端口的使用v动态或私有的端口:动态或私有的端口:4915265535v层次名字空间层次名字空间v便于记忆和使用便于记忆和使用v计算机通信时无法使用计算机通信时无法使用v域名地址解析:域名地址解析:v名字到名字到IP地址的解析地址的解析gethostbyname)vIP地址到域名的解析地址到域名的解析gethostbyaddr)v网络中通信双方由以下五元组唯一确定:网络中通

7、信双方由以下五元组唯一确定:v(本地(本地IP地址、本地端口号、远程地址、本地端口号、远程IP地址、远程端地址、远程端口号、协议类型)口号、协议类型)vUDP:用户数据报协议:用户数据报协议vUDP提供无连接服务提供无连接服务vUDP缺乏可靠性支持,应用程序必须实现缺乏可靠性支持,应用程序必须实现确认、超时、重传、流控等功能确认、超时、重传、流控等功能vUDP面向记录服务面向记录服务源端口目的端口长度校验和数据01531#ifdef _FAVOR_BSDstruct udphdr u_int16_t uh_sport; /* source port */ u_int16_t uh_dport;

8、 /* destination port */ u_int16_t uh_ulen; /* udp length */ u_int16_t uh_sum; /* udp checksum */;#elsestruct udphdr u_int16_t source; u_int16_t dest; u_int16_t len; u_int16_t check;#endifvTCP:传输控制协议:传输控制协议vTCP是面向连接的是面向连接的vTCP提供可靠性,实现了丢失重传,提供可靠性,实现了丢失重传,RTT的估算。的估算。vTCP通过给所发送数据的每一个段管理一通过给所发送数据的每一个段管理一

9、个序列号进行排序。个序列号进行排序。vTCP提供流量控制和拥塞控制:通告窗口、提供流量控制和拥塞控制:通告窗口、拥塞窗口。拥塞窗口。HLEN窗口序列号确认号源端口目的端口保管码位校验和紧急指针选项填充字节数据URGACKPSHRSTSYNFIN015317首部数据区struct tcphdr WORD SourPort;WORD DestPort;DWORD SeqNo;DWORD AckNo;BYTE HLen;BYTE Flag;WORD Window;WORD ChkSum;WORD UrgPtr;/* Put options here. */; vTCP连接的过程:连接的过程:v服务器

10、必须准备好接受外来的连接。通过调用服务器必须准备好接受外来的连接。通过调用socket, bind, listen函数完成。称为被动打开。函数完成。称为被动打开。v客户通过调用客户通过调用connect进行主动打开。这引起客户进行主动打开。这引起客户TCP发送一个发送一个SYN分组,告诉服务器客户将在连接分组,告诉服务器客户将在连接中发送的数据的初始序列号。中发送的数据的初始序列号。v服务器必须确认客户的服务器必须确认客户的SYN,同时自己也得发送一,同时自己也得发送一个个SYN分组。服务器以单个分节向客户发送分组。服务器以单个分节向客户发送SYN和和对客户的对客户的SYN的的ACK。v客户必

11、须确认服务器的客户必须确认服务器的SYN。客户服务器SocketConnect(阻塞)(主动打开)Socket,bind,listen(被动打开)SYN JSYN K, ack J+1ack K+1Accept返回Read阻塞Connect返回客户客户服务器服务器Close主动关闭主动关闭被动关闭被动关闭Read返回返回0FIN Mack N+1Closeack M+1FIN Nv系统调用:应用程序和操作系统传递控制权系统调用:应用程序和操作系统传递控制权函数调用)函数调用)v目的是从操作系统获得服务目的是从操作系统获得服务v一定的权限控制一定的权限控制应用程序应用程序1包括包括TCP/IP协

12、议软件的操作系统内核协议软件的操作系统内核应用程序应用程序2应用程序应用程序3在用户地址空间在用户地址空间中的应用程序中的应用程序系统调用接口系统调用接口系统地址中的协系统地址中的协议软件议软件v使用新的系统调用来访问使用新的系统调用来访问TCP/IPv对于每个概念性的操作实现一个系统调用对于每个概念性的操作实现一个系统调用v创建新的系统调用并不明智创建新的系统调用并不明智v使用一般的使用一般的I/O调用来访问调用来访问TCP/IPv使用一般的使用一般的I/O调用,但是进行了扩充,既可以调用,但是进行了扩充,既可以用于用于I/O,又可以用于网络协议,又可以用于网络协议v混合方法混合方法v尽可能

13、使用基本的尽可能使用基本的I/O功能功能v增加一些函数来实现其它操作增加一些函数来实现其它操作v理解基本理解基本I/O如何扩展功能,六个基本的系统函如何扩展功能,六个基本的系统函数:数:操作操作含义含义OpenCloseReadWriteLseekIoctl为输入或输出操作准备一个设备或者文件为输入或输出操作准备一个设备或者文件终止使用以前已打开的设备或者文件终止使用以前已打开的设备或者文件从输入设备或者文件中得到数据从输入设备或者文件中得到数据数据从应用程序存储器传到设备或文件中数据从应用程序存储器传到设备或文件中转到文件或者设备中的某个指定位置转到文件或者设备中的某个指定位置控制设备或者用

14、于访问该设备的软件控制设备或者用于访问该设备的软件int descdesc=open(“filename”, O_RDWR, 0)read(desc,buffer,128)close(desc)v扩展文件描述符:可以用于网络通信扩展文件描述符:可以用于网络通信v扩展扩展read和和write:可以用于网络接收:可以用于网络接收/发送数据发送数据v额外功能的处理,增加新系统调用:额外功能的处理,增加新系统调用:v指明本地和远端的端口,远程指明本地和远端的端口,远程IP地址地址v使用使用TCP还是还是UDPv启动传输还是等待传入连接启动传输还是等待传入连接v可以接受多少传入连接可以接受多少传入连接

15、vTCP/IP协议存在于协议存在于OS中,网络服务通过中,网络服务通过OS提供提供v在在OS中增加支持中增加支持TCP/IP的系统调用的系统调用Berkeley套接字套接字v如如Socket,Connect,Send,Recv等函数等函数v1981提出提出BSD4.1 UNIX,本书基于,本书基于BSD4.4 版本版本processTCP withbuffers,variablessocket由应用程序由应用程序开发者控制开发者控制由操作系统控制由操作系统控制host orserverprocessTCP withbuffers,variablessocketcontrolled byappl

16、icationdevelopercontrolled byoperatingsystemhost orserverinternetv来自来自UNIX系统系统vBerkeley套接字套接字vARPA要求伯克利分校将要求伯克利分校将TCP/IP移植到移植到UNIX中中v需要创建一个接口,便于应用程序使用这个接口需要创建一个接口,便于应用程序使用这个接口 进进行网络通信行网络通信v尽可能使用现有的系统调用,同时添加新的系统调尽可能使用现有的系统调用,同时添加新的系统调用支持用支持TCP/IPv这个系统被称为这个系统被称为BSD UNIX 套接字,成为事实上的套接字,成为事实上的标准标准v思索:接口是

17、专门针对思索:接口是专门针对TCP/IP, 还是可以为其它还是可以为其它协议所用呢协议所用呢?v方法一:定义专门支持方法一:定义专门支持TCP/IP通信的一些函数通信的一些函数v方法二:定义支持一般网络通信的函数,用参数方法二:定义支持一般网络通信的函数,用参数是是TCP/IP通信作为一种特例通信作为一种特例vBerkeley套接字使用第二种办法,具有通用性,套接字使用第二种办法,具有通用性,TCP/IP是一个族是一个族 PF_INETv争论:争论:v通用性没有必要,使应用程序难以阅读通用性没有必要,使应用程序难以阅读v通用性可以使程序员免于了解协议族的细节通用性可以使程序员免于了解协议族的细

18、节vOS将文件描述符实现为一个指针数组,指向一将文件描述符实现为一个指针数组,指向一个内部的数据结构:进程描述符表的下标个内部的数据结构:进程描述符表的下标v套接字和文件类似,每个活动套接字使用一个套接字和文件类似,每个活动套接字使用一个小整数标识,进程的文件描述符和套接字描述小整数标识,进程的文件描述符和套接字描述符值不能相同符值不能相同vsocket函数:创建套接字描述符不是函数:创建套接字描述符不是creat函函数)数)0:1:2:3: 进程的文件描述符表进程的文件描述符表用于文件用于文件0的内部数据结构的内部数据结构用于文件用于文件1的内部数据结构的内部数据结构用于文件用于文件2的内部

19、数据结构的内部数据结构用于文件用于文件3的内部数据结构的内部数据结构(一个进程一张表)(一个进程一张表)v调用调用socket将创建一个新的描述符条目将创建一个新的描述符条目v结构的许多字段是其他的系统调用来填结构的许多字段是其他的系统调用来填0:1:2:3:4: 描述符表描述符表(一个进程一张)(一个进程一张)family: PF_INETservice: SOCK_STREAMLocal IP:Remote IP:Local port:Remote port:v创建方式相同,使用方式不同创建方式相同,使用方式不同v等待传入连接的套接字等待传入连接的套接字被动,如服务器套接字被动,如服务器套

20、接字v发起连接的套接字发起连接的套接字自动,如客户套接字自动,如客户套接字v指明端点地址:创建时不指定,使用时指明指明端点地址:创建时不指定,使用时指明vTCP/IP需要指明协议端口号和需要指明协议端口号和IP地址地址vTCP/IP协议族:协议族:PF_INETvTCP/IP的地址族:的地址族:AF_INETv套接字系统定义的一般化的地址结构套接字系统定义的一般化的地址结构v(地址族,该族的端点地址)(地址族,该族的端点地址)套接字的普通套接字的普通C定义结定义结构构struct sockaddr u_char sa_len;u_short sa_family;char sa_data14;/

21、14B通用的地址结构只通用的地址结构只是很适用于是很适用于AF_INET族族中的地址)中的地址)TCP/IP的地址定义的地址定义struct sockaddr_in u_char sin_len;u_short sin_family;u_short sin_port;/2Bstruct in_addr sin_addr;/4Bchar sin_zero8;/8B未使未使用用 IP专用的结构专用的结构v套接字调用分为两组:套接字调用分为两组:v主调用:提供对下层功能的访问主调用:提供对下层功能的访问v实用例程:提供帮助实用例程:提供帮助v套接字带有参数,允许以多种方式来使用它们。套接字带有参数,

22、允许以多种方式来使用它们。v可被客户或服务器使用可被客户或服务器使用v可被可被TCP或或UDP使用使用v可被特定或非特定的远程端点地址所使用可被特定或非特定的远程端点地址所使用v 功能:创建一个新的套接字,返回套接字描述符功能:创建一个新的套接字,返回套接字描述符v 参数说明:参数说明:v domain:域类型,指明使用的协议栈,如:域类型,指明使用的协议栈,如TCP/IP使用的是使用的是 PF_INET;v type: 指明需要的服务类型:指明需要的服务类型:v SOCK_DGRAM: 数据报服务,数据报服务,UDP协协v SOCK_STREAM: 流服务,流服务,TCP协议协议v prot

23、ocol:一般都取一般都取0v 举例:举例:int socket( int domain, int type, int protocol)v功能:功能: 同远程服务器建立主动连接,成功时返回同远程服务器建立主动连接,成功时返回0,若连接失败返回,若连接失败返回-1。v参数说明:参数说明:vSockfd:套接字描述符,指明创建连接的套接字套接字描述符,指明创建连接的套接字vServer_addr:指明远程端点:指明远程端点:IP地址和端口号地址和端口号vsockaddr_len :地址长度地址长度v举例举例:int connectint sockfd, struct sockaddr *serv

24、er_addr, int sockaddr_len)v功能:功能:v在在TCPTCP连接上发送数据连接上发送数据, ,返回成功传送数据的长度,返回成功传送数据的长度,出错时返回出错时返回-1-1。vsendsend会将外发数据复制到会将外发数据复制到OSOS内核中,也可以使用内核中,也可以使用sendsend发送面向连接的发送面向连接的UDPUDP报文。报文。v参数说明:参数说明:vsockfd:sockfd:套接字描述符套接字描述符vdata:data:指向要发送数据的指针指向要发送数据的指针vdata_len:data_len:数据长度数据长度vflags:flags:一直为一直为0 0v

25、举例举例v功能:基于功能:基于UDP发送数据报,返回实际发送的数据发送数据报,返回实际发送的数据长度,出错时返回长度,出错时返回-1v参数说明:参数说明:vsockfd:套接字描述符套接字描述符vdata:指向要发送数据的指针指向要发送数据的指针vdata_len:数据长度数据长度vflags:一直为一直为0vremaddr:远端地址:远端地址:IP地址和端口号地址和端口号vremaddr_len :地址长度地址长度v举例:举例:sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&address, sizeof(address);in

26、t sendto(int sockfd, const void * data, int data_len, unsigned int flags, struct sockaddr *remaddr,int remaddr_len)v 功能:功能:v 从从TCP接收数据,返回实际接收的数据长度,出错时返回接收数据,返回实际接收的数据长度,出错时返回-1。如果没有数据,将阻塞,如果收到的数据大于缓存的。如果没有数据,将阻塞,如果收到的数据大于缓存的大小,多余的数据将丢弃。大小,多余的数据将丢弃。v 参数说明:参数说明:v Sockfd:套接字描述符套接字描述符v Buf:指向内存块的指针指向内存块

27、的指针v Buf_len:内存块大小,以字节为单位内存块大小,以字节为单位v flags:一般为一般为0 v 举例:举例:v 功能:从功能:从UDP接收数据,返回实际接收的字节数,失败时接收数据,返回实际接收的字节数,失败时返回返回-1.v 参数说明:参数说明:v sockfd:套接字描述符套接字描述符v buf:指向内存块的指针指向内存块的指针v buf_len:内存块大小,以字节为单位内存块大小,以字节为单位v flags:一般为一般为0v from:远端的地址,远端的地址,IP地址和端口号地址和端口号v fromlen:远端地址长度远端地址长度v 举例:举例:recvfrom(sockf

28、d, buf, 8192, 0, (struct sockaddr *)&address, sizeof(address); int recvfrom(int sockfd, void *buf, int buf_len, unsigned int flags, struct sockaddr *from, int fromlen)v功能:功能:v撤销套接字撤销套接字;v如果只有一个进程使用,立即终止连接并撤销该如果只有一个进程使用,立即终止连接并撤销该套接字,如果多个进程共享该套接字,将引用数套接字,如果多个进程共享该套接字,将引用数减一,如果引用数降到零,则撤销它。减一,如果引用数

29、降到零,则撤销它。v参数说明:参数说明:vsockfd:套接字描述符套接字描述符v举例:举例:close(socket_descriptor)v功能:为套接字指明一个本地端点地址功能:为套接字指明一个本地端点地址vTCP/IP协议使用协议使用sockaddr_in结构,包含结构,包含IP地址和地址和端口号;服务器使用它来指明熟知的端口号,然后端口号;服务器使用它来指明熟知的端口号,然后等待连接。等待连接。v参数说明:参数说明:vSockfd:套接字描述符,指明创建连接的套接字套接字描述符,指明创建连接的套接字vmy_addr:本地地址,本地地址,IP地址和端口号地址和端口号vaddrlen :

30、地址长度地址长度v举例:举例:bind(sockfd, (struct sockaddr *)&address, sizeof(address); 功能:面向连接的服务器使用它将一个套接功能:面向连接的服务器使用它将一个套接字置为被动模式,并准备接收传入连接。字置为被动模式,并准备接收传入连接。用于服务器,指明某个套接字连接是被动用于服务器,指明某个套接字连接是被动的的参数说明:参数说明:Sockfd: 指明创建连接的套接字指明创建连接的套接字input_queue_size: 该套接字使用的队列长度该套接字使用的队列长度, 指定在请求队列中允许的最大请求数指定在请求队列中允许的最大请

31、求数 举例:举例:listen(sockfd,20)int listen(int sockfd,int input_queue_size)v功能:获取传入连接请求,返回新的连接的套接功能:获取传入连接请求,返回新的连接的套接字描述符。字描述符。v为每个新的连接请求创建了一个新的套接字,服为每个新的连接请求创建了一个新的套接字,服务器只对新的连接使用该套接字,原来的监听套务器只对新的连接使用该套接字,原来的监听套接字接受其他的连接请求。接字接受其他的连接请求。v新的连接上传输数据使用新的套接字,使用完毕,新的连接上传输数据使用新的套接字,使用完毕,服务器将关闭这个套接字。服务器将关闭这个套接字。

32、v参数说明:参数说明:vsockfd:套接字描述符,指明正在监听的套接字套接字描述符,指明正在监听的套接字vaddr:提出连接请求的主机地址提出连接请求的主机地址vaddrlen:地址长度地址长度v举例:举例:new_sockfd = accept(sockfd, (struct sockaddr *)&address, sizeof(address);int accept(int sockfd, void *addr, int addrlen)vread和和write函数函数v在在UNIX和和Linux中,可以代替中,可以代替recv和和send。v小结:小结:socket*conn

33、ect*send(write)*recv(read)*close*bindlistenacceptrecvmsgsendmsgrecvfromsendtoshutdowngetpeernamegetsockoptsetsockoptv使用使用TCP的客户和服务器套接字函数调用序列的客户和服务器套接字函数调用序列socket客户端客户端connectsendrecvclosesocket服务器端服务器端bindlistenacceptclosesendrecvv网络字节顺序:最高位字节在前网络字节顺序:最高位字节在前v有些套接字例程要求参数按照网络字节顺序存储。有些套接字例程要求参数按照网络字节

34、顺序存储。如如sockaddr_inv需要网络字节顺序和本地主机字节顺序进行转换的需要网络字节顺序和本地主机字节顺序进行转换的函数,坚持使用,便于移植。函数,坚持使用,便于移植。v分为短分为短short 16位位)和长和长long 32位位)两种两种vhtons():将一个短整数从本地字节顺序转换为网络将一个短整数从本地字节顺序转换为网络字节顺序;字节顺序;vntohs():将一个短整数从网络字节顺序转换为本地将一个短整数从网络字节顺序转换为本地字节顺序;字节顺序;vhtonl()和和ntohl():类似如上:类似如上vUNIX系统提供了预定义的符号常量和数据结构来系统提供了预定义的符号常量和

35、数据结构来声明数据和指明参数:声明数据和指明参数:v使用何种服务:使用何种服务:vSOCK_DGRAM: 数据报服务,数据报服务,UDP协议协议vSOCK_STREAM: 流服务,流服务,TCP协议协议vPF_INET:使用:使用TCP/IP协议族协议族vAF_INET: 使用使用TCP/IP地址结构地址结构v需要需要include,引用出现这些定义的文本,引用出现这些定义的文本v#include v#include v应用程序如何发起通信成为客户应用程序如何发起通信成为客户v如何使用如何使用TCP或或UDP与服务器联系与服务器联系v如何使用套接字调用与协议交互如何使用套接字调用与协议交互v

36、初始化期望与之通信的服务器初始化期望与之通信的服务器IP地址和协议地址和协议端口号端口号v 分配套接字分配套接字socket()v 指明此连接需要在本地机器中的、任意的、指明此连接需要在本地机器中的、任意的、未使用的协议端口,并允许未使用的协议端口,并允许TCP选择一个这选择一个这样的端口样的端口v 将这个套接字连接到服务器将这个套接字连接到服务器connect()v 使用应用级协议与服务器通信使用应用级协议与服务器通信send()/recv() v 关闭连接关闭连接close()v应用程序必须指明的细节应用程序必须指明的细节v客户还是服务器客户还是服务器v端点地址端点地址v使用面向连接的还是

37、无连接的服务使用面向连接的还是无连接的服务v如何执行授权和防护准则如何执行授权和防护准则v所需要的缓存的大小等所需要的缓存的大小等v只需要概念性地了解套接字只需要概念性地了解套接字APIv需要详细了解构造通信程序的各种方法,便于迅需要详细了解构造通信程序的各种方法,便于迅速作出设计决策。速作出设计决策。v客户应用程序比较简单客户应用程序比较简单v不必明显地处理并发性不必明显地处理并发性v不需要特权,和常规的应用程序一样执行不需要特权,和常规的应用程序一样执行v不需要强行保护,依赖操作系统自动强迫执行保不需要强行保护,依赖操作系统自动强迫执行保护护v在编译程序时,将服务器的域名或者在编译程序时,

38、将服务器的域名或者IP地址说地址说明为常量明为常量v执行快,但是服务器移动后不便执行快,但是服务器移动后不便v要求用户在启动程序时标定服务器要求用户在启动程序时标定服务器v从稳定的存储设备中获得关于服务器的信息从稳定的存储设备中获得关于服务器的信息v如果文件不存在,客户软件就不能执行如果文件不存在,客户软件就不能执行v使用某个单独的协议来找到服务器使用某个单独的协议来找到服务器v只能在本地小环境下应用只能在本地小环境下应用v根据实际情况,综合标识服务器地址根据实际情况,综合标识服务器地址v初始化服务器的地址结构初始化服务器的地址结构TCP/IP的地址定义的地址定义struct sockaddr

39、_in u_char sin_len;u_short sin_family;u_short sin_port;/2Bstruct in_addr sin_addr;/4Bchar sin_zero8;/8B未使未使用用 IP专用的结构专用的结构l地址结构长度地址结构长度l地址的协议地址的协议AF_INETl端口号端口号lIP地址地址v参数由字符串构成,客户使用参数语法参数由字符串构成,客户使用参数语法:v 域名方式或域名方式或IP地址方式地址方式v域名和域名和IP地址的确定:扫描参数,看是否含有字地址的确定:扫描参数,看是否含有字母。母。v全参数化的客户软件允许用户指明协议端口号和全参数化的客

40、户软件允许用户指明协议端口号和机器机器v使用两个参数:使用两个参数: smtpv使用单个参数:使用单个参数::smtpv遵循本地系统的约定:遵循本地系统的约定:Linux使用单独参数指明使用单独参数指明服务器的机器地址和协议端口服务器的机器地址和协议端口v使用使用sockaddr_in结构指明服务器的地址结构指明服务器的地址v需要二进制表示的需要二进制表示的32bit IP地址地址v套接字对地址转换的支持两个库例程)套接字对地址转换的支持两个库例程)vinet_addr: IP地址点分十进制到二进制的转换地址点分十进制到二进制的转换v接受

41、一个点分十进制表示的字符串地址,返回一接受一个点分十进制表示的字符串地址,返回一个等价的二进制地址个等价的二进制地址vgethostbyname: 主机域名到二进制的转换主机域名到二进制的转换v接受一个机器域名字符串,返回一个接受一个机器域名字符串,返回一个hostent结构,结构,内含一个二进制表示的主机内含一个二进制表示的主机IP地址地址struct hostentchar *h_name;char *h_aliases;int h_addrtype;int h_length;char *h_addr_list;#define h_addr h_addr_list0Struct hoste

42、nt *hptr;Char *examplenam=””;If(hptr=gethostbyname(examplenam)/*IP address is now in hptr-h_addr*/else /*error in name-handle it*/vgetservbyname: 两个参数指明期望的服务和协两个参数指明期望的服务和协议。返回议。返回servent类型的结构指针;类型的结构指针;v注意网络字节顺序和本地机器的表示方法;注意网络字节顺序和本地机器的表示方法;struct serventchar *s_name;char *s_ali

43、ases;int s_port;char *s_proto;vgetprotobyname: 由协议名返回协议号;返回一个由协议名返回协议号;返回一个protoent类型结构的地址类型结构的地址struct protoentchar *p_name;char *p_aliases;char *p_proto;struct protoent *pptr;if (pptr = getprotobyname(“udp”) /* official protocol number is now in pptr -p_proto*/else /* error occurred-handle it */v使

44、用使用socket函数函数v将协议和服务分别说明为将协议和服务分别说明为PF_INET和和SOCK_STREAMvinclude语句包含一些定义常量的文件语句包含一些定义常量的文件v对于对于TCP/IP,第三个参数没有用。,第三个参数没有用。#include #include int s; /* socket descriptor */s = socket ( PF_INET, SOCK_STREAM, 0);v服务器运行于熟知的端口上,客户不是服务器运行于熟知的端口上,客户不是v客户使用端口的规则:客户使用端口的规则:v该端口不与该机器其他进程使用端口冲突该端口不与该机器其他进程使用端口冲突

45、v该端口没有被分配给某个熟知服务该端口没有被分配给某个熟知服务v客户允许客户允许TCP自动选择本地端口自动选择本地端口vconnect调用的一个效果就是所选择的本地端口能调用的一个效果就是所选择的本地端口能够满足上述准则够满足上述准则v对于只挂在一个网络上的主机是简单的对于只挂在一个网络上的主机是简单的v正确的选择依赖于选路信息,但应用程序很少使正确的选择依赖于选路信息,但应用程序很少使用选路信息,实际中存在的问题:用选路信息,实际中存在的问题:v一个主机可能具有多个一个主机可能具有多个IP地址地址v如果应用程序随机选择一个如果应用程序随机选择一个IP地址,可能选择了地址,可能选择了一个与一个

46、与IP地址的接口并不匹配的地址。地址的接口并不匹配的地址。v可能能够正确的工作。但是网络管理会困难和混可能能够正确的工作。但是网络管理会困难和混乱,可靠性降低。乱,可靠性降低。v一般本地地址字段不填,允许客户自动选取本地一般本地地址字段不填,允许客户自动选取本地IP地址地址vconnect函数:允许函数:允许TCP套接字发起连接套接字发起连接v强迫执行下层的三次握手强迫执行下层的三次握手v超时或者建立连接后返回超时或者建立连接后返回v三个参数:三个参数:vretcode = connect(s, remaddr, remaddrlen);vs: 套接字的描述符套接字的描述符vremaddr:一

47、个一个sockaddr_in类型结构的地址类型结构的地址vremaddrlen:第二个参数的长度第二个参数的长度vconnect的四项任务的四项任务v对指明的套接字进行检测:有效,没有连接对指明的套接字进行检测:有效,没有连接v将第二个参数给出的端点地址填入套接字中将第二个参数给出的端点地址填入套接字中v为此套接字选择一个本地端点地址为此套接字选择一个本地端点地址v发起一个发起一个TCP连接,并返回一个值连接,并返回一个值v客户发送请求,等待响应客户发送请求,等待响应v发送请求:发送请求:send;v等待响应:等待响应:recv;vTCP不保持记录的边界,面向流的概念不保持记录的边界,面向流的

48、概念send(s, req, strlen(req), 0);while (n = recv (s, bptr, buflen, 0) 0) bptr +=n;buflen -=n;vclose:从容关闭连接释放该套接字:从容关闭连接释放该套接字v常常需要在客户服务器之间协调关闭事宜常常需要在客户服务器之间协调关闭事宜v服务器不能关闭连接,不知客户请求是否完成服务器不能关闭连接,不知客户请求是否完成v客户不知道服务器发出的数据是否全部到达客户不知道服务器发出的数据是否全部到达v允许应用程序在一个方向关闭允许应用程序在一个方向关闭TCP连连vshutdown(s, direction);vdir

49、ection:0不允许输入不允许输入; 1不允许输出不允许输出; 2双向关闭双向关闭v部分关闭可以让服务器发送完最后一个响应后,部分关闭可以让服务器发送完最后一个响应后,关闭连接。关闭连接。vDAYTIME服务服务v功能:只要连接到来,服务器就构造包含当前日期功能:只要连接到来,服务器就构造包含当前日期时间的文本字符串发送,然后关闭连接。客户不用时间的文本字符串发送,然后关闭连接。客户不用发送任何数据,发送了也会忽略。发送任何数据,发送了也会忽略。v周知端口:周知端口:13while( (n = read(s, buf, LINELEN) 0) bufn = 0;(void) fputs( b

50、uf, stdout );参考例子参考例子daytime.cv初始化期望与之通信的服务器初始化期望与之通信的服务器IP地址和协议端口号地址和协议端口号v分配套接字分配套接字socket()v指明这种通信需要本地机器中的、任意的、未使用指明这种通信需要本地机器中的、任意的、未使用的协议端口,并允许的协议端口,并允许UDP选择一个这样的端口选择一个这样的端口connect()v指明报文所要发往的服务器指明报文所要发往的服务器sendto()v使用应用级协议与服务器通信使用应用级协议与服务器通信sendto()/recvform()v关闭连接关闭连接close()v连接的连接的UDP通信通信v客户使

51、用客户使用connect调用指明远程端点地址调用指明远程端点地址v使用使用SOCK_DGRAM类型的套接字类型的套接字v不发起任何分组交换,不检查远程端点合法性不发起任何分组交换,不检查远程端点合法性v只是在套接字的数据结构记录远程端点的信息只是在套接字的数据结构记录远程端点的信息v不用重复指明远端地址收发报文不用重复指明远端地址收发报文v只和一个服务器交互比较方便只和一个服务器交互比较方便v非连接的非连接的UDP通信通信v在每次发送报文的时候指明远程目的地在每次发送报文的时候指明远程目的地v使用灵活,便于同不同的服务器通信使用灵活,便于同不同的服务器通信v对于连接的对于连接的UDP套接字套接

52、字v使用使用send发送报文发送报文v使用使用recv接收报文接收报文v每次每次send发送一个完整的报文发送一个完整的报文v每次每次recv接收一个完整的报文,足够大缓存接收一个完整的报文,足够大缓存v不需要重复使用不需要重复使用recv获得单个报文获得单个报文v对于非连接的对于非连接的UDP套接字套接字vsendto: 发送报文,含有地址信息发送报文,含有地址信息 vrecvfrom: 接收一个含有源地址的数据报接收一个含有源地址的数据报vclose: 关闭套接字,释放与之关联的资源关闭套接字,释放与之关联的资源v拒绝以后到达的报文拒绝以后到达的报文v没有通知远程端点没有通知远程端点vsh

53、utdown: 在某个方向上终止进一步传输在某个方向上终止进一步传输v不向另外一方发送任何报文,只是在本地套接字不向另外一方发送任何报文,只是在本地套接字标明不期望在指定的方向传输数据标明不期望在指定的方向传输数据v客户关闭输出以后,服务器并不知道客户关闭输出以后,服务器并不知道vUDP提供的是不可靠的交互提供的是不可靠的交互v必须自己设计协议实现可靠性必须自己设计协议实现可靠性vTIME服务:允许一台机器从另外一台机器获得日服务:允许一台机器从另外一台机器获得日期和时间。由于存在不同的时区,所有的时间日期和时间。由于存在不同的时区,所有的时间日期信息必须用国际标准时间:期信息必须用国际标准时

54、间:UCT或或UTv服务器应答前将本地时间转化为标准时间服务器应答前将本地时间转化为标准时间v客户收到应答时,将国际标准时间转化为本地时客户收到应答时,将国际标准时间转化为本地时间间vTIME协议规定由协议规定由32bit的整数来表示:用于一台的整数来表示:用于一台计算机使用另外一系统时钟来设置起事件计算机使用另外一系统时钟来设置起事件v可以使用可以使用UDP(TCP)访问访问TIME服务服务v客户发出包含单个数据报的请求客户发出包含单个数据报的请求v服务器从传入的数据报中取出地址和端口号服务器从传入的数据报中取出地址和端口号v服务器将当前时间编码为一个整数,使用上述地址服务器将当前时间编码为

55、一个整数,使用上述地址和端口号发回给客户和端口号发回给客户(void) write(s, MSG, strlen(MSG);n = read(s, (char *)&now, sizeof(now);now = ntohl(unsigned long)now);now -= UNIXEPOCH;printf(%s, ctime(&now);使用连接的使用连接的UDP服务服务vECHO服务器返回从客户收到的所有数据,用户服务器返回从客户收到的所有数据,用户网络管理员测试可达性,调试协议软件,识别选网络管理员测试可达性,调试协议软件,识别选路问题等路问题等vTCP ECHO服务:接

56、收连接请求,从连接中读取服务:接收连接请求,从连接中读取数据,在该连接上将数据写回。直到客户终止传数据,在该连接上将数据写回。直到客户终止传送。送。vUDP ECHO服务:接收整个数据报,根据数据报服务:接收整个数据报,根据数据报指明的端口号和地址,返回整个数据。指明的端口号和地址,返回整个数据。请编写请编写TCP-ECHO.c和和UDP-ECHO.c代码代码while (fgets(buf, sizeof(buf), stdin) bufLINELEN = 0; outchars = strlen(buf); (void) write(s, buf, outchars);for (incha

57、rs = 0; inchars outchars; inchars+=n ) n = read(s, &bufinchars, outchars - inchars); fputs(buf, stdout);v服务器软件设计存在的问题服务器软件设计存在的问题v四种基本类型的服务器程序四种基本类型的服务器程序v本地地址结构的初始化本地地址结构的初始化v周知端口绑定及被动模式的设置周知端口绑定及被动模式的设置vaccept()函数调用函数调用v循环服务器的设计循环服务器的设计v面向连接的和非连接的设计方法面向连接的和非连接的设计方法v并发服务器的设计并发服务器的设计v多进程的多线程并发服务

58、器设计多进程的多线程并发服务器设计v单进程中多线程的并发服务器设计单进程中多线程的并发服务器设计v循环的或者并发的循环的或者并发的v使用面向连接的或者无连接的传输使用面向连接的或者无连接的传输循环的无连接循环的面向连接并发的无连接并发的面向连接v初始化地址协议族初始化地址协议族vAF_INETv初始化周知端口初始化周知端口vgetservbyname()v初始化本地初始化本地IP地址地址v对于多接口主机对于多接口主机使用使用INADDR_ANY指明了一个通配地址,指明了一个通配地址,让该主机的任何一个让该主机的任何一个IP地址都匹配地址都匹配TCP/IP的地址定义的地址定义struct soc

59、kaddr_in u_char sin_len;u_short sin_family;u_short sin_port;/2Bstruct in_addr sin_addr;/4Bchar sin_zero8;/8B未未使用使用 IP专用的结构专用的结构vbind系统调用用于将描述符和该地址结构进行绑定系统调用用于将描述符和该地址结构进行绑定vlisten系统调用用于将套接字置于被动模式系统调用用于将套接字置于被动模式vinput_queue_size参数指明套接字内部的请求队列参数指明套接字内部的请求队列长度长度v请求队列保存一组请求队列保存一组TCP传入连接请求,来自客户,传入连接请求,来

60、自客户,都向这个服务器请求一个连接都向这个服务器请求一个连接int bind(int sockfd, struct sockaddr * my_addr, int addrlen)int listen(int sockfd, int input_queue_size)vaccept系统调用用于接受连接请求并使用这些连接系统调用用于接受连接请求并使用这些连接v返回新的连接的套接字的描述符返回新的连接的套接字的描述符v新的套接字描述符用于为连接请求服务新的套接字描述符用于为连接请求服务v原来的主套接字描述符用于在窗口等待请求原来的主套接字描述符用于在窗口等待请求v服务器接收连接,使用服务器接收连接,使用read获得来自客户的应用协获得来自客户的应用协议,使用议,使用write发回应答。发回应答。v服务器结束连接

温馨提示

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

评论

0/150

提交评论