收藏 分销(赏)

第11章高级套接字.ppt

上传人:xrp****65 文档编号:13183683 上传时间:2026-01-31 格式:PPT 页数:36 大小:652KB 下载积分:10 金币
下载 相关 举报
第11章高级套接字.ppt_第1页
第1页 / 共36页
第11章高级套接字.ppt_第2页
第2页 / 共36页


点击查看更多>>
资源描述
,Click to edit Master title style,Click to edit Master text styles,Click to edit Master title style,Click to edit Master text styles,第,11,章 高级套接字,前面几章内容对通用的,UDP,、,TCP,的程序设计方法进行了介绍,本章介绍高级套接字的编程。包含,UNIX,域的函数、广播、多播、数据链路层的程序设计等在,Linux,网络程序设计中比较常用的方法,主要有如下内容。,UNIX,编程:介绍,AF_UNIX,协议族类型,特别是结构,struct,sockaddr_un,、编程方法。,广播的知识:介绍广播的概念、如何进行广播的编程及一个简单的例子。,多播的知识:介绍多播的概念和多播的地址,并介绍多播的客户端和服务器的编程实例。,数据链路层的访问:介绍,SOCK_PACKET,协议类型,如何获得从数据链路层到应用层的数据。,11.1 UNIX,域函数,UNIX,域的协议族是在同一台主机上的客户,/,服务器通信时使用的一种方法。相对其他方法(例如进程间通信的管道),它在形式上与传统套接字,API,的调用方法相同。,UNIX,域有两种类型的套接字:字节流套接字和数据报套接字,字节流套接字类似于,TCP,,数据报套接字类似于,UDP,。,UNIX,域的套接字有如下的特点值得注意。,UNIX,域套接字与,TCP,套接字相比较,在同一台主机的传输速度前者是后者的两倍。,UNIX,域套接字可以在同一台主机上各进程之间传递描述符。,UNIX,域套接字与传统套接字的区别是用路径名来表示协议族的描述。,11.1.1 UNIX,域函数的地址结构,UNIX,域的地址结构在文件,中定义,结构的原型如下:,#define UNIX_PATH_MAX108,struct,sockaddr_un,sa_family_t,sun_family,;/*AF_UNIX,协议族名称*,/,char,sun_pathUNIX_PATH_MAX,;/*,路径名*,/,;,UNIX,域地址结构成员变量,sun_family,的值是,AF_UNIX,或者,AF_LOCAL,。,sun_path,是一个路径名,此路径名的属性为,0777,,可以进行读写等操作。,结构,sockaddr_un,的长度使用宏,SUN_LEN,定义,默认大小为,108,,,SUN_LEN,宏的定义如下:,#define,SUN_LEN(ptr,)(,size_t,)(,struct,sockaddr_un,*)0)-,sun_path,),+,strlen,(,ptr,)-,sun_path,),11.1.2,套接字函数,UNIX,域的套接字函数和以太网套接字(,AF_INET,)的函数相同,但是当用于,UNIX,域套接字时,套接字函数有一些差别和限制,主要有如下几条。,使用函数,bind(),进行套接字和地址的绑定的时候,地址结构中的路径名和路径名所表示的文件的默认访问权限为,0777,,即用户、用户所属的组和其他组的用户都能读、写和执行。,11.1.3,使用,UNIX,域函数进行套接字编程,使用,UNIX,域函数进行套接字编程与,AF_INET,的方式一致,不同的地方在于地址结构不同。,字节,0,1,2,3,4,5,6,7,8,9,10,11,内容,/,d,e,m,o,n,/,p,a,t,h,0,11.1.4,传递文件描述符,Linux,系统中提供了一种特殊的方法,可以从一个进程中将一个已经打开的文件描述符传递给其他的任何进程。其基本过程如下:,(,1,)创建一个字节流或者数据报的,UNIX,域套接字。,(,2,)进程可以用任何返回描述符的,UNIX,函数打开一个描述符:,(,3,)发送进程建立一个,msghdr,结构,其中包含要传递的描述符。,(,4,)接收进程调用,recvmsg,(),在,UNIX,域套接字上接收套接字。,11.1.5,socketpair,(),函数,函数,socketpair,(),建立一对匿名的已经连接的套接字,其特性由协议族,d,、类型,type,、协议,protocol,决定,建立的两个套接字描述符会放在,sv0,和,sv1,中。,函数,socketpair,(),的原型如下,第一个参数,d,,表示协议族,只能为,AF_LOCAL,或者,AF_UNIX,;第二个参数,type,,表示类型,只能为,0,。第三个参数,protocol,,表示协议,可以是,SOCK_STREAM,或者,SOCK_DGRAM,。用,SOCK_STREAM,建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。参数,sv,,用于保存建立的套接字对。,#include,#include,int,socketpair(int,d,int,type,int,protocol,int,sv2);,11.1.5,socketpair,(),函数,值,含义,EAFNOSUPPORT,指定的地址族本机不支持,EFAULT,参数,sv,所指不是本进程的合法地址,EMFILE,本进程使用了过多的描述符,ENFILE,系统的文件打开总数量已经达到,EOPNOTSUPP,所指定的协议不能用于建立套接字对,EPROTONOSUPPORT,所指定的协议本机不支持,11.1.6,传递文件描述符的例子,本节中使用一个实例来介绍进程间传递文件描述符的例子。分为两个进程,进程,A,中打开一个文件描述符,通过消息传送的方式将文件描述符传递给进程,B,。,1,进程,A,的代码,2,进程,B,的代码,11.2,广播,前面介绍的,TCP/IP,知识都是基于单播,即一对一的方式的,本节介绍一对多的广播方式。广播是由一个主机发向一个网络上所有主机的操作方式。例如在一个局域网内进行广播,同一子网内的所有主机都可以收到此广播发送的数据。,11.2.1,广播的,IP,地址,要使用广播,需要了解,IPv4,特定的广播地址。,IP,地址分为左边的网络,ID,部分以及右边的主机,ID,部分。广播地址所用的,IP,地址将表示主机,ID,的位全部设置为,1,。网卡正确配置以后,可以用下面的命令来显示所选用接口的广播地址:,#,ifconfig,eth0,eth0 Link,encap:Ethernet,HWaddr,00:A0:4B:06:F4:8D,inet,addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0,UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1,RX packets:1955 errors:0 dropped:0 overruns:0 frame:31,TX packets:1064 errors:0 dropped:0 overruns:0 carrier:0,collisions:0 txqueuelen:100,Interrupt:9 Baseaddress:0 xe400,11.2.2,广播与单播的比较,广播和单播的处理过程是不同的,单播的数据只是收发数据的特定主机进行处理,而广播的数据整个局域网都进行处理。,主机,A,B,C,IP,地址,192.168.1.150,192.168.1.151,192.168.1.158,MAC,地址,00:00:00:00:00:01,00:00:00:00:00:02,00:00:00:00:00:03,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_TTL,2,选项,IP_MULTICAST_IF,3,选项,IP_ADD_MEMBERSHIP,和,IP_DROP_MEMBERSHIP,4,选项,IP_DROP_MEMBERSHIP,5,多播程序设计的框架,11.3.3,多播的编程,11.3.4,内核中的多播,Linux,内核中的多播是利用结构,struct,ip_mc_socklist,来将多播的各个方面连接起来的。,1,结构,ip_mc_socklist,2,结构,ip_mreqn,3,结构,ip_sf_socklist,4,选项,IP_ADD_MEMBERSHIP,5,选项,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.1 SOCK_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;,int,app_len,=0;,if(p_iphdr,-protocol=6),struct,tcphdr,*,p_tcphdr,=(,struct,tcphdr,*)(,p_iphdr+p_iphdr,-,ihl,*4);,app_data,=,p_tcphdr,+20;,app_len,=n-16-,p_iphdr,-,ihl,*4-20;,else,if(p_iphdr,-protocol=17),struct,udphdr,*,p_udphdr,=(,struct,udphdr,*)(,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(application,data address:0 x%x,length:%dn,app_data,app_len,);,11.4.8,使用,SOCK_PACKET,编写,ARP,请求程序的例子,本小节利用,SOCK_PACKET,套接字进行,ARP,请求的程序设计,并给出代码的例子。,1,ARP,协议数据和结构,2,例子中的,ARP,数据结构,3,ARP,请求的主程序代码,11.5,小结,本节中的内容介绍了网络套接字编程中的比较高级的知识,通常这些知识只有在比较特殊的情况下才会使用,但是某些知识却是经常使用而不会察觉的,例如广播和多播。本章中的利用广播获得服务器,IP,地址的方法是一个比较实用的案例,在完备的网络应用程序中经常使用。,除了以上的知识,还有一些高级套接字的知识,本章限于篇幅没有进行介绍,例如带外数据、,IP,选项、路由套接字接口等等。,带外数据指当连接中的双方如果有紧急的事情想要通知对方,发送高优先级数据。在发送的时候,发送函数的选项部分通常使用,MSG_OOB,,例如:,send(s,“URG”,3,MSG_OOB);,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服