免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2148 | 回复: 6
打印 上一主题 下一主题

读unix网络编程时遇到的一个问题,请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-11 17:51 |只看该作者 |倒序浏览
本帖最后由 kutong 于 2010-11-11 17:53 编辑

下面这段代码是UNP第一卷,第17章中的一个程序,route/getrt.c
我有一个疑问,想请教各位,在第19行和第35行有同样一条语句
rtm = (struct rt_msghdr *) buf;
我不明白这条语句为什么需要出现两次?
麻烦大家指点,先谢过了

#include     "unproute.h"

2 #define BUFLEN   (sizeof(struct rt_msghdr) + 512)
3                      /* sizeof(struct sockaddr_in6) * 8 = 192 */
4 #define SEQ      9999

5 int
6 main(int argc, char **argv)
7 {
8     int     sockfd;
9     char   *buf;
10     pid_t   pid;
11     ssize_t n;
12     struct rt_msghdr *rtm;
13     struct sockaddr *sa, *rti_info[RTAX_MAX];
14     struct sockaddr_in *sin;

15     if (argc != 2)
16         err_quit("usage: getrt <IPaddress>");

17     sockfd = Socket(AF_ROUTE, SOCK_RAW, 0); /* need superuser privileges */

18     buf = Calloc(1, BUFLEN);     /* and initialized to 0 */

19     rtm = (struct rt_msghdr *) buf;
20     rtm->rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);
21     rtm->rtm_version = RTM_VERSION;
22     rtm->rtm_type = RTM_GET;
23     rtm->rtm_addrs = RTA_DST;
24     rtm->rtm_pid = pid = getpid();
25     rtm->rtm_seq = SEQ;

26     sin = (struct sockaddr_in *) (rtm + 1);
27     sin->sin_len = sizeof(struct sockaddr_in);
28     sin->sin_family = AF_INET;
29     Inet_pton(AF_INET, argv[1], &sin->sin_addr);

30     Write(sockfd, rtm, rtm->rtm_msglen);

31     do {
32         n = Read(sockfd, rtm, BUFLEN);
33     } while (rtm->rtm_type != RTM_GET || rtm->rtm_seq != SEQ ||
34              rtm->rtm_pid != pid);

35     rtm = (struct rt_msghdr *) buf;
36     sa = (struct sockaddr *) (rtm + 1);
37     get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
38     if ( (sa = rti_info[RTAX_DST]) != NULL)
39         printf("dest: %s\n", Sock_ntop_host(sa, sa->sa_len));

40     if ( (sa = rti_info[RTAX_GATEWAY]) != NULL)
41         printf("gateway: %s\n", Sock_ntop_host(sa, sa->sa_len));

42     if ( (sa = rti_info[RTAX_NETMASK]) != NULL)
43         printf("netmask: %s\n", Sock_masktop(sa, sa->sa_len));

44     if ( (sa = rti_info[RTAX_GENMASK]) != NULL)
45         printf("genmask: %s\n", Sock_masktop(sa, sa->sa_len));

46     exit(0);
47 }

论坛徽章:
0
2 [报告]
发表于 2010-11-11 22:28 |只看该作者
要沉了,自己顶一下吧,不好意思了.实在是希望能有朋友指点一二

论坛徽章:
0
3 [报告]
发表于 2010-11-12 10:19 |只看该作者
32         n = Read(sockfd, rtm, BUFLEN);

rtm被修改了

论坛徽章:
0
4 [报告]
发表于 2010-11-12 10:45 |只看该作者
我觉得在执行完n = Read(sockfd, rtm, BUFLEN);之后,只是rtm所指向的那块内存中的内容有变化吧,rtm所指向的地址应该没变吧?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2010-11-12 10:52 |只看该作者
看代码我也觉得是多余的

论坛徽章:
0
6 [报告]
发表于 2010-11-12 10:58 |只看该作者
但是这是stevens的代码,第2版,第3版里都有这两条语句.所以不敢确定,拿上来请各位高手确诊一下.

论坛徽章:
0
7 [报告]
发表于 2010-11-12 14:29 |只看该作者
多谢楼上两位的指点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP