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

上传人:小飞机 文档编号:5623577 上传时间:2023-08-03 格式:PPT 页数:36 大小:602.50KB
返回 下载 相关 举报
《高级套接字》PPT课件.ppt_第1页
第1页 / 共36页
《高级套接字》PPT课件.ppt_第2页
第2页 / 共36页
《高级套接字》PPT课件.ppt_第3页
第3页 / 共36页
《高级套接字》PPT课件.ppt_第4页
第4页 / 共36页
《高级套接字》PPT课件.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《《高级套接字》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《高级套接字》PPT课件.ppt(36页珍藏版)》请在三一办公上搜索。

1、第11章 高级套接字,前面几章内容对通用的UDP、TCP的程序设计方法进行了介绍,本章介绍高级套接字的编程。包含UNIX域的函数、广播、多播、数据链路层的程序设计等在Linux网络程序设计中比较常用的方法,主要有如下内容。UNIX编程:介绍AF_UNIX协议族类型,特别是结构struct sockaddr_un、编程方法。广播的知识:介绍广播的概念、如何进行广播的编程及一个简单的例子。多播的知识:介绍多播的概念和多播的地址,并介绍多播的客户端和服务器的编程实例。数据链路层的访问:介绍SOCK_PACKET协议类型,如何获得从数据链路层到应用层的数据。,11.1 UNIX域函数,UNIX域的协议

2、族是在同一台主机上的客户/服务器通信时使用的一种方法。相对其他方法(例如进程间通信的管道),它在形式上与传统套接字API的调用方法相同。UNIX域有两种类型的套接字:字节流套接字和数据报套接字,字节流套接字类似于TCP,数据报套接字类似于UDP。UNIX域的套接字有如下的特点值得注意。UNIX域套接字与TCP套接字相比较,在同一台主机的传输速度前者是后者的两倍。UNIX域套接字可以在同一台主机上各进程之间传递描述符。UNIX域套接字与传统套接字的区别是用路径名来表示协议族的描述。,11.1.1 UNIX域函数的地址结构,UNIX域的地址结构在文件中定义,结构的原型如下:#define UNIX

3、_PATH_MAX108struct 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)

4、+strlen(ptr)-sun_path),11.1.2 套接字函数,UNIX域的套接字函数和以太网套接字(AF_INET)的函数相同,但是当用于UNIX域套接字时,套接字函数有一些差别和限制,主要有如下几条。使用函数bind()进行套接字和地址的绑定的时候,地址结构中的路径名和路径名所表示的文件的默认访问权限为0777,即用户、用户所属的组和其他组的用户都能读、写和执行。,11.1.3 使用UNIX域函数进行套接字编程,使用UNIX域函数进行套接字编程与AF_INET的方式一致,不同的地方在于地址结构不同。,11.1.4 传递文件描述符,Linux系统中提供了一种特殊的方法,可以从一个进程

5、中将一个已经打开的文件描述符传递给其他的任何进程。其基本过程如下:(1)创建一个字节流或者数据报的UNIX域套接字。(2)进程可以用任何返回描述符的UNIX函数打开一个描述符:(3)发送进程建立一个msghdr结构,其中包含要传递的描述符。(4)接收进程调用recvmsg()在UNIX域套接字上接收套接字。,11.1.5 socketpair()函数,函数socketpair()建立一对匿名的已经连接的套接字,其特性由协议族d、类型type、协议protocol决定,建立的两个套接字描述符会放在sv0和sv1中。函数socketpair()的原型如下,第一个参数d,表示协议族,只能为AF_LO

6、CAL或者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()函数,11.1.6 传递文件描述符的例子,本节中使用一个实例来介绍进程间传递文件描述符的例子。分为两个进程

7、,进程A中打开一个文件描述符,通过消息传送的方式将文件描述符传递给进程B。1进程A的代码2进程B的代码,11.2 广播,前面介绍的TCP/IP知识都是基于单播,即一对一的方式的,本节介绍一对多的广播方式。广播是由一个主机发向一个网络上所有主机的操作方式。例如在一个局域网内进行广播,同一子网内的所有主机都可以收到此广播发送的数据。,11.2.1 广播的IP地址,要使用广播,需要了解IPv4特定的广播地址。IP地址分为左边的网络ID部分以及右边的主机ID部分。广播地址所用的IP地址将表示主机ID的位全部设置为1。网卡正确配置以后,可以用下面的命令来显示所选用接口的广播地址:#ifconfig et

8、h0eth0 Link encap:Ethernet HWaddr 00:A0:4B:06:F4:8D inet 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 广播与单播的比较

9、,广播和单播的处理过程是不同的,单播的数据只是收发数据的特定主机进行处理,而广播的数据整个局域网都进行处理。,11.2.2 广播与单播的比较,11.2.2 广播与单播的比较,11.2.3 广播的示例,本小节中的是一个服务器地址发现的代码,假设服务器为A,客户端为B。客户端在某个局域网启动的时候,不知道本局域网内是否有适合的服务器存在,它会使用广播在本局域网内发送特定协议的请求,如果有服务器响应了这种请求,则使用响应请求的IP地址进行连接,这是一种服务器/客户端自动发现的常用方法。1广播例子简介2广播的服务器端代码3广播的客户端代码,11.2.3 广播的示例,11.3 多播,单播用于两个主机之间

10、的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的猛尽,11.3.1 多播的概念,多播,也称为“组播”,将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据。在广域网上广播的时候,其中的交换机和路由器只向需要获取数据的主机复制并转发数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,将数据仅仅传输

11、给组内的主机。多播的这种功能,可以一次将数据发送到多个主机,又能保证不影响其他不需要(未加入组)的主机的其他通讯。,11.3.2 广域网的多播,多播的地址是特定的,D类地址用于多播。D类IP地址就是多播IP地址,即至之间的IP地址,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类:局部多播地址,在之间,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;预留多播地址,在之间,可用于全球范围(如Internet)或网络协议;管理权限多播地址,在之间,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。,11.3.3 多播的编程,多播的程

12、序设计使用函数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内核中的多播是利用结构struct ip_mc_socklist来将多播的各个方面连接起来的。1结构ip_mc_socklist2结构ip_mreqn3结构ip_sf_socklist4选项IP_ADD_MEMBERSHI

13、P5选项IP_DROP_MEMBERSHIP,11.3.4 内核中的多播,11.3.4 内核中的多播,11.3.5 一个多播例子的服务器端,下面是一个多播服务器的例子。多播服务器的程序设计很简单,建立一个数据包套接字,选定多播的IP地址和端口,直接向此多播地址发送数据就可以了。多播服务器的程序设计,不需要服务器加入多播组,可以直接向某个多播组发送数据。,11.3.6 一个多播例子的客户端,多播组的IP地址为,端口为8888,当客户端接收到多播的数据后将打印出来。客户端只有在加入多播组后才能接受多播组的数据,因此多播客户端的在接收多播组的数据之前需要先加入多播组,当接收完毕后要退出多播组。,11

14、.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 x000

15、3表示截取的数据帧的类型为不确定,处理所有的包。使用SOCK_PACKET进行程序设计的时候,需要注意的主要方面包括协议族选择、获取原始包、定位IP包、定位TCP包、定位UDP包、定位应用层数据几个部分,下面几节中将进行详细的介绍。,11.4.2 设置套接口以捕获链路帧的编程方法,在Linux下编写网络监听程序,比较简单的方法是在超级用户模式下,利用类型为SOCK_PACKET的套接口(用socket()函数创建)来捕获链路帧数据。Linux程序中需引用如下头文件:#include#include/*ioctl 命令*/#include/*ethhdr 结构*/#include/*ifreq

16、结构*/#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.

17、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*

18、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请求的程序设计,

19、并给出代码的例子。1ARP协议数据和结构2例子中的ARP数据结构3ARP请求的主程序代码,11.5 小结,本节中的内容介绍了网络套接字编程中的比较高级的知识,通常这些知识只有在比较特殊的情况下才会使用,但是某些知识却是经常使用而不会察觉的,例如广播和多播。本章中的利用广播获得服务器IP地址的方法是一个比较实用的案例,在完备的网络应用程序中经常使用。除了以上的知识,还有一些高级套接字的知识,本章限于篇幅没有进行介绍,例如带外数据、IP选项、路由套接字接口等等。带外数据指当连接中的双方如果有紧急的事情想要通知对方,发送高优先级数据。在发送的时候,发送函数的选项部分通常使用MSG_OOB,例如:send(s,“URG”,3,MSG_OOB);,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号