《高级套接字》PPT课件.ppt

上传人:za****8 文档编号:12727450 上传时间:2020-05-20 格式:PPT 页数:36 大小:652.06KB
返回 下载 相关 举报
《高级套接字》PPT课件.ppt_第1页
第1页 / 共36页
《高级套接字》PPT课件.ppt_第2页
第2页 / 共36页
《高级套接字》PPT课件.ppt_第3页
第3页 / 共36页
点击查看更多>>
资源描述
第11章高级套接字,前面几章内容对通用的UDP、TCP的程序设计方法进行了介绍,本章介绍高级套接字的编程。包含UNIX域的函数、广播、多播、数据链路层的程序设计等在Linux网络程序设计中比较常用的方法,主要有如下内容。UNIX编程:介绍AF_UNIX协议族类型,特别是结构structsockaddr_un、编程方法。广播的知识:介绍广播的概念、如何进行广播的编程及一个简单的例子。多播的知识:介绍多播的概念和多播的地址,并介绍多播的客户端和服务器的编程实例。数据链路层的访问:介绍SOCK_PACKET协议类型,如何获得从数据链路层到应用层的数据。,11.1UNIX域函数,UNIX域的协议族是在同一台主机上的客户/服务器通信时使用的一种方法。相对其他方法(例如进程间通信的管道),它在形式上与传统套接字API的调用方法相同。UNIX域有两种类型的套接字:字节流套接字和数据报套接字,字节流套接字类似于TCP,数据报套接字类似于UDP。UNIX域的套接字有如下的特点值得注意。UNIX域套接字与TCP套接字相比较,在同一台主机的传输速度前者是后者的两倍。UNIX域套接字可以在同一台主机上各进程之间传递描述符。UNIX域套接字与传统套接字的区别是用路径名来表示协议族的描述。,11.1.1UNIX域函数的地址结构,UNIX域的地址结构在文件中定义,结构的原型如下:#defineUNIX_PATH_MAX108structsockaddr_unsa_family_tsun_family;/*AF_UNIX协议族名称*/charsun_pathUNIX_PATH_MAX;/*路径名*/;UNIX域地址结构成员变量sun_family的值是AF_UNIX或者AF_LOCAL。sun_path是一个路径名,此路径名的属性为0777,可以进行读写等操作。结构sockaddr_un的长度使用宏SUN_LEN定义,默认大小为108,SUN_LEN宏的定义如下:#defineSUN_LEN(ptr)(size_t)(structsockaddr_un*)0)-sun_path)+strlen(ptr)-sun_path),11.1.2套接字函数,UNIX域的套接字函数和以太网套接字(AF_INET)的函数相同,但是当用于UNIX域套接字时,套接字函数有一些差别和限制,主要有如下几条。使用函数bind()进行套接字和地址的绑定的时候,地址结构中的路径名和路径名所表示的文件的默认访问权限为0777,即用户、用户所属的组和其他组的用户都能读、写和执行。,11.1.3使用UNIX域函数进行套接字编程,使用UNIX域函数进行套接字编程与AF_INET的方式一致,不同的地方在于地址结构不同。,11.1.4传递文件描述符,Linux系统中提供了一种特殊的方法,可以从一个进程中将一个已经打开的文件描述符传递给其他的任何进程。其基本过程如下:(1)创建一个字节流或者数据报的UNIX域套接字。(2)进程可以用任何返回描述符的UNIX函数打开一个描述符:(3)发送进程建立一个msghdr结构,其中包含要传递的描述符。(4)接收进程调用recvmsg()在UNIX域套接字上接收套接字。,11.1.5socketpair()函数,函数socketpair()建立一对匿名的已经连接的套接字,其特性由协议族d、类型type、协议protocol决定,建立的两个套接字描述符会放在sv0和sv1中。函数socketpair()的原型如下,第一个参数d,表示协议族,只能为AF_LOCAL或者AF_UNIX;第二个参数type,表示类型,只能为0。第三个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。参数sv,用于保存建立的套接字对。#include#includeintsocketpair(intd,inttype,intprotocol,intsv2);,11.1.5socketpair()函数,11.1.6传递文件描述符的例子,本节中使用一个实例来介绍进程间传递文件描述符的例子。分为两个进程,进程A中打开一个文件描述符,通过消息传送的方式将文件描述符传递给进程B。1进程A的代码2进程B的代码,11.2广播,前面介绍的TCP/IP知识都是基于单播,即一对一的方式的,本节介绍一对多的广播方式。广播是由一个主机发向一个网络上所有主机的操作方式。例如在一个局域网内进行广播,同一子网内的所有主机都可以收到此广播发送的数据。,11.2.1广播的IP地址,要使用广播,需要了解IPv4特定的广播地址。IP地址分为左边的网络ID部分以及右边的主机ID部分。广播地址所用的IP地址将表示主机ID的位全部设置为1。网卡正确配置以后,可以用下面的命令来显示所选用接口的广播地址:#ifconfigeth0eth0Linkencap:EthernetHWaddr00:A0:4B:06:F4:8Dinetaddr:192.168.0.1Bcast:192.168.0.255Mask:255.255.255.0UPBROADCASTRUNNINGPROMISCMULTICASTMTU:1500Metric:1RXpackets:1955errors:0dropped:0overruns:0frame:31TXpackets:1064errors:0dropped:0overruns:0carrier:0collisions:0txqueuelen:100Interrupt:9Baseaddress:0 xe400,11.2.2广播与单播的比较,广播和单播的处理过程是不同的,单播的数据只是收发数据的特定主机进行处理,而广播的数据整个局域网都进行处理。,11.2.2广播与单播的比较,11.2.2广播与单播的比较,11.2.3广播的示例,本小节中的是一个服务器地址发现的代码,假设服务器为A,客户端为B。客户端在某个局域网启动的时候,不知道本局域网内是否有适合的服务器存在,它会使用广播在本局域网内发送特定协议的请求,如果有服务器响应了这种请求,则使用响应请求的IP地址进行连接,这是一种服务器/客户端自动发现的常用方法。1广播例子简介2广播的服务器端代码3广播的客户端代码,11.2.3广播的示例,11.3多播,单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的猛尽,11.3.1多播的概念,多播,也称为“组播”,将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据。在广域网上广播的时候,其中的交换机和路由器只向需要获取数据的主机复制并转发数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,将数据仅仅传输给组内的主机。多播的这种功能,可以一次将数据发送到多个主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。,11.3.2广域网的多播,多播的地址是特定的,D类地址用于多播。D类IP地址就是多播IP地址,即224.0.0.0至239.255.255.255之间的IP地址,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类:局部多播地址,在224.0.0.0224.0.0.255之间,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;预留多播地址,在224.0.1.0238.255.255.255之间,可用于全球范围(如Internet)或网络协议;管理权限多播地址,在239.0.0.0239.255.255.255之间,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。,11.3.3多播的编程,多播的程序设计使用函数setsockopt()和getsockopt()函数来实现,组播的选项是IP层的。1选项IP_MULTICASE_TTL2选项IP_MULTICAST_IF3选项IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP4选项IP_DROP_MEMBERSHIP5多播程序设计的框架,11.3.3多播的编程,11.3.4内核中的多播,Linux内核中的多播是利用结构structip_mc_socklist来将多播的各个方面连接起来的。1结构ip_mc_socklist2结构ip_mreqn3结构ip_sf_socklist4选项IP_ADD_MEMBERSHIP5选项IP_DROP_MEMBERSHIP,11.3.4内核中的多播,11.3.4内核中的多播,11.3.5一个多播例子的服务器端,下面是一个多播服务器的例子。多播服务器的程序设计很简单,建立一个数据包套接字,选定多播的IP地址和端口,直接向此多播地址发送数据就可以了。多播服务器的程序设计,不需要服务器加入多播组,可以直接向某个多播组发送数据。,11.3.6一个多播例子的客户端,多播组的IP地址为224.0.0.88,端口为8888,当客户端接收到多播的数据后将打印出来。客户端只有在加入多播组后才能接受多播组的数据,因此多播客户端的在接收多播组的数据之前需要先加入多播组,当接收完毕后要退出多播组。,11.4数据链路层访问,在Linux下数据链路层的访问通常是通过编写内核驱动程序来实现的,在应用层使用SOCK_PACKET类型的协议族可以实现部分功能。,11.4.1SOCK_PACKET类型,建立套接字的时候选择SOCK_PACKET类型,内核将不对网络数据进行处理而直接交给用户,数据直接从网卡的协议栈直接交给用户。建立一个SOCK_PACKET类型的套接字使用如下方式:socket(AF_INET,SOCK_PACKET,htons(0 x0003);其中AF_INET=2表示因特网协议族,SOCK_PACKET=10表示截取数据帧的层次在物理层,网络协议栈对数据不作处理。值0 x0003表示截取的数据帧的类型为不确定,处理所有的包。使用SOCK_PACKET进行程序设计的时候,需要注意的主要方面包括协议族选择、获取原始包、定位IP包、定位TCP包、定位UDP包、定位应用层数据几个部分,下面几节中将进行详细的介绍。,11.4.2设置套接口以捕获链路帧的编程方法,在Linux下编写网络监听程序,比较简单的方法是在超级用户模式下,利用类型为SOCK_PACKET的套接口(用socket()函数创建)来捕获链路帧数据。Linux程序中需引用如下头文件:#include#include/*ioctl命令*/#include/*ethhdr结构*/#include/*ifreq结构*/#include/*in_addr接哦股*/#include/*iphdr结构*/#include/*udphdr结构*/#include/*tcphdr结构*/,11.4.3从套接口读取链路帧的编程方法,以太网的数据结构如所示,总长度最大为1518字节,最小为64字节,其中目标地址的MAC为6字节,源地址MAC为6字节,协议类型为2字节,含有461500字节的数据,尾部为4个字节的CRC校验和。以太网的CRC校验和一般由硬件自动设置或者剥离,应用层不用考虑。,11.4.4定位IP信包头的编程方法,获得以太网帧后,当协议为0 x0800时,其负载部分为IP协议。,11.4.5定位TCP报头的编程方法,TCP的数据结构。,11.4.6定位UDP报头的编程方法,UDP的数据结构。,11.4.7定位应用层报文数据的编程方法,定位了UDP和TCP头部地址后,其中的数据部分为应用层报文数据。根据TCP和UDP的协议获得应用程序的指针的代码如下:char*app_data=NULL;intapp_len=0;if(p_iphdr-protocol=6)structtcphdr*p_tcphdr=(structtcphdr*)(p_iphdr+p_iphdr-ihl*4);app_data=p_tcphdr+20;app_len=n-16-p_iphdr-ihl*4-20;elseif(p_iphdr-protocol=17)structudphdr*p_udphdr=(structudphdr*)(p_iphdr+p_iphdr-ihl*4);app_data=p_udphdr+p_udphdr-len;app_len=n-16-p_iphdr-ihl*4-p_udphdr-len;printf(applicationdataaddress:0 x%x,length:%dn,app_data,app_len);,11.4.8使用SOCK_PACKET编写ARP请求程序的例子,本小节利用SOCK_PACKET套接字进行ARP请求的程序设计,并给出代码的例子。1ARP协议数据和结构2例子中的ARP数据结构3ARP请求的主程序代码,11.5小结,本节中的内容介绍了网络套接字编程中的比较高级的知识,通常这些知识只有在比较特殊的情况下才会使用,但是某些知识却是经常使用而不会察觉的,例如广播和多播。本章中的利用广播获得服务器IP地址的方法是一个比较实用的案例,在完备的网络应用程序中经常使用。除了以上的知识,还有一些高级套接字的知识,本章限于篇幅没有进行介绍,例如带外数据、IP选项、路由套接字接口等等。带外数据指当连接中的双方如果有紧急的事情想要通知对方,发送高优先级数据。在发送的时候,发送函数的选项部分通常使用MSG_OOB,例如:send(s,“URG”,3,MSG_OOB);,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!