网站大量收购独家精品文档,联系QQ:2885784924

Linux/UNIX网络编程 甘刚 第11章 路由套接字编程新.pptVIP

Linux/UNIX网络编程 甘刚 第11章 路由套接字编程新.ppt

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第11章 路由套接字编程 路由套接字概论 Uinx系统集成了路由的功能,它包含相应的路由数据库可提供路由信息,用户可以使用命令方式来增加、修改、删除路由表中的项目,也可以只查看路由表中的信息。除此外,应用程序可以使用路由套接字实现对路由表的读/写操作。应用程序通过写操作把消息发送给路由子系统以增加或删除路由:通过读操作接收从路由子系统发送来的路由信息。 在路由套接字上返回的消息中包含数据链路套接字地址结构 struct sockaddr_dl{ uint8_t sdl_len; sa_family_t sdl_family; unit16_t sdl_index; unit8_t sdl_type; unit8_t sdl_nlen; unit8_t sdl_alen; unit8_t sdl_slen; char sdl_data[12]; }; 创建路由套接字 格式: int sockfd; sockfd=socket(AF_ROUTE,SOCK_RAW,0); 通信域为AF_ROUTE,它只能支持原始套接字,只有超级用户才能创建这个套接字。 通过路由套接字发送和接收的消息结构 读取路由表项的程序 #include netinet/in.h #include arpa/inet.h #include sys/types.h #include sys/socket.h #include net/route.h #include sys/param.h #include stdlib.h #include stdio.h #include unistd.h void cp_rtaddrs(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_info[RTA_NUMBITS]; struct sockaddr_in *sin; if(argc!=2){ printf(usage:%sIPaddress\n,argv[0]); 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_version=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,argv[1],sin-sin_addr); write(sockfd,rtm,rtm-rtm_msglen); /*发送RTM_GET消息给路由套接字*/ /*通个循环读取路由套接字中的消息,直到读到类型为RTM_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

您可能关注的文档

文档评论(0)

精品课件 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档