《Linux/UNIX网络编程》-甘刚-电子教案 第11章 路由套接字编程

上传人:E**** 文档编号:89431816 上传时间:2019-05-25 格式:PPT 页数:14 大小:61.50KB
返回 下载 相关 举报
《Linux/UNIX网络编程》-甘刚-电子教案 第11章 路由套接字编程_第1页
第1页 / 共14页
《Linux/UNIX网络编程》-甘刚-电子教案 第11章 路由套接字编程_第2页
第2页 / 共14页
《Linux/UNIX网络编程》-甘刚-电子教案 第11章 路由套接字编程_第3页
第3页 / 共14页
《Linux/UNIX网络编程》-甘刚-电子教案 第11章 路由套接字编程_第4页
第4页 / 共14页
《Linux/UNIX网络编程》-甘刚-电子教案 第11章 路由套接字编程_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《《Linux/UNIX网络编程》-甘刚-电子教案 第11章 路由套接字编程》由会员分享,可在线阅读,更多相关《《Linux/UNIX网络编程》-甘刚-电子教案 第11章 路由套接字编程(14页珍藏版)》请在金锄头文库上搜索。

1、第11章 路由套接字编程,路由套接字概论,Uinx系统集成了路由的功能,它包含相应的路由数据库可提供路由信息,用户可以使用命令方式来增加、修改、删除路由表中的项目,也可以只查看路由表中的信息。除此外,应用程序可以使用路由套接字实现对路由表的读/写操作。应用程序通过写操作把消息发送给路由子系统以增加或删除路由:通过读操作接收从路由子系统发送来的路由信息。,在路由套接字上返回的消息中包含数据链路套接字地址结构,struct sockaddr_dl uint8_t sdl_len; sa_family_t sdl_family; unit16_t sdl_index; unit8_t sdl_typ

2、e; unit8_t sdl_nlen; unit8_t sdl_alen; unit8_t sdl_slen; char sdl_data12; ;,创建路由套接字,格式: int sockfd; sockfd=socket(AF_ROUTE,SOCK_RAW,0); 通信域为AF_ROUTE,它只能支持原始套接字,只有超级用户才能创建这个套接字。,通过路由套接字发送和接收的消息结构,读取路由表项的程序,#include #include #include #include #include #include #include #include #include void cp_rtaddr

3、s(int,sockaddr_in *,sockaddr_in *); /*此函数用于将收到的套接字地址拷入套接字地址数据rt_info中。*/ #define BUFLEN (sizeof(rt_msghdr)+512) /*消息缓冲区的长度*/ #define SEQ 1234 /*消息序号*/,int main(int argc,char *argv) int sockfd; char *buf; pit_t pid; ssize_t n; struct rt_msghdr *rtm; struct sockaddr_in *sa, *rt_infoRTA_NUMBITS; struct

4、 sockaddr_in *sin; if(argc!=2) printf(“usage:%sn“,argv0); exit(0); sockfd=socket(AF_ROUTE,SOCK_RAW,0); /*创建路由套接字*/ if(sockfd=-1) perror(“socket error“); exit(1); ,buf=(char*) calloc(1,BUFLEN); /*分配缓冲区*/ rtm=(rt_msghdr*)buf; rtm-rtm_msglen=sizeof(rt_msghdr)+sizeof(sockaddr_in); /*消息长度*/ rtm-rtm_versi

5、on=RTM_VERSION; /*版本号*/ rtm-rtm_type=RTM_GET; /* 消息类型*/ rtm-rtm_addrs=RTA_DST; /*位屏蔽字*/ rtm-rtm_pid=pid=getpid(); /*进程号*/ rtm-rtm_seq=SEQ; /*序号*/ sin=(sockaddr_in *) (rtm+1); /*将目的地址填入跟在消息头后的套接字地址项中。*/ sin-sin_family=AF_INET; inet_pton(AF_INET,argv1, /*发送RTM_GET消息给路由套接字*/ /*通个循环读取路由套接字中的消息,直到读到类型为RT

6、M_GET、序号为SEQ、进程ID为当前进程ID的消息,表明该消息是所发消息的回应。*/ do ,n=read(sockfd,rtm,BUFLEN); while(rtm-rtm_type!=RTM_GET|rtm-rtm_seq!=SEQ|rtm-rtm_pid!=pid); sa=(sockaddr_in*) (rtm+1); cp_rtaddrs(rtm-rtm_addrs,sa,rt_info); /*将读取的套接字地址拷入数组rt_info中。*/ if(sa=rt_infoRTA_DST)!=NULL) /*如果存在目的地址项*/ printf(“dest:%sn“,inet_nt

7、oa(sa-sin_addr); if(sa=rt_infoRTA_GATEWAY)!=NULL) /*如果存在网关地址项*/ printf(“gateway:%sn“,inet_ntoa(sa-sin_addr);,if(sa=rt_infoRTA_NETMASK)!=NULL) /*如果存在网络掩码地址项*/ printf(“netmask:%sn“,inet_ntoa(sa-sin_addr); exit(0); /*以下函数实现依次检查位屏蔽字,如果某项存在,则拷入对应项目,否则填入NULL。*/ void cp_rtaddrs(int addrs,struct sockaddr_in

8、 *sa,struct sockaddr_in *rt_info) int i; for(i=0;iRTA_NUMBITS;i+) if(addrs ,sysctl操作,前面的例子可以读取目的主机上的路由表,它是通过创建一个路由套接字,再读这个套接字来实现的,但是创建路由套接字需要超级用户权限。作为一般的应用程序,通常情况下是没有超级用户权限的,sysctl可以使不具有超级用户权限的程序读路由表和接口表。,函数的原型如下: #include #include Int sysctl(int *name,u_int namelen,void *oldp,size_t *oldlenp,void *

9、newp,size_t newlen); 参数说明: name指定名字的一个整数数组。 namelen数组中的元素数目。 数组的第一个元素指明请求被发往内核的哪个子系统。第二个参数指明这个子系统的某个部分。要读取路由表数据,请求应该发往网络子系统,所以数组的第一个元素要设为CTL_NET,第二个元素可以是: AF_INET:获取或设置影响网际协议的变量。 AF_LINK:获取或设置链路层信息。 AF_ROUTE:返回路由表或接口列表的信息。 AF_UNSPEC:获取或设置一些套接字层的变量,譬如套接字的发送或接收缓冲区的最大容量。,接口名和索引函数,RFC2133定义了四个处理接口名和索引的函

10、数,每个接口有一个唯一的名字和一个唯一的大于0的索引。这四个函数如下: #include unsigned int if_nametoindex(const char *ifname); 此函数成功时返回正的接口索引,出错时返回0。 char * if_indextoname(unsigned int ifindex,char * ifname); 此函数成功时返回指向接口名的指针,出错时返回NULL。,struct if_nameindex * if_nameindex(void); 此函数成功时返回非空指针,出错时返回NULL。 void if_freenameindex(struct if_nameindex *ptr); if_nametoindex函数是将接口名转换为索引号,if_indextoname是将索引号转换为接口名。 ifnameindex函数返回一个指向if_nameindex结构的数组指针,它包含所有的接口名和索引。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号