免费注册 查看新帖 |

Chinaunix

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

修改UNIX® Network Programming中routing socket的程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-25 22:01 |只看该作者 |倒序浏览

                读这本书的时候,发现里面的18.3的例子不能在solaris上运行,于是修改了一下,使它能够在solaris nevada上跑。主要是struct sockaddr在solaris上的定义里没有sa_len这一项,
/*
* Structure used by kernel to store most
* addresses.
*/
struct sockaddr {
        sa_family_t     sa_family;      /* address family */
        char            sa_data[14];    /* up to 14 bytes of direct address */
};
所以书里面的程序无法编译,包括libroute下的程序所以后面的例子自然也无法编译。
修改后的getrt.c如下,当然对GATEWAY的处理有些简单,大家有兴趣自己完善吧。
/* include getrt1 */
#include        "unproute.h"
#define BUFLEN  (sizeof(struct rt_msghdr) + 512)
                        /* sizeof(struct sockaddr_in6) * 8 = 192 */
#define SEQ             9999
void
get_rtaddrs(int addrs, SA *sa, SA **rti_info)
{
        int             i;
        for (i = 0; i ");
        sockfd = Socket(AF_ROUTE, SOCK_RAW, 0); /* need superuser privileges */
        buf = Calloc(1, BUFLEN);        /* and initialized to 0 */
        rtm = (struct rt_msghdr *) buf;
        rtm->rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct 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 = (struct sockaddr_in *) (rtm + 1);
        sin->sin_family = AF_INET;
        Inet_pton(AF_INET, argv[1], &sin->sin_addr);
        Write(sockfd, rtm, rtm->rtm_msglen);
        do {
                n = Read(sockfd, rtm, BUFLEN);
        } while (rtm->rtm_type != RTM_GET || rtm->rtm_seq != SEQ ||
                         rtm->rtm_pid != pid);
/* end getrt1 */
/* include getrt2 */
        rtm = (struct rt_msghdr *) buf;
        sa = (struct sockaddr *) (rtm + 1);
        get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
        if ( (sa = rti_info[RTAX_DST]) != NULL) {
                ptr = &sa->sa_data[2];
                printf("dest: [%d.%d.%d.%d]\n",
                        *ptr ? *ptr : 0,
                        *(ptr + 1) ? *(ptr + 1) : 0,
                        *(ptr + 2) ? *(ptr + 2) : 0,
                        *(ptr + 3) ? *(ptr + 3) : 0);
        }
        if ( (sa = rti_info[RTAX_GATEWAY]) != NULL) {
                ptr = &sa->sa_data[2];
                printf("gateway: [%d.%d.%d.%d]\n",
                        *ptr ? *ptr : 0,
                        *(ptr + 1) ? *(ptr + 1) : 0,
                        *(ptr + 2) ? *(ptr + 2) : 0,
                        *(ptr + 3) ? *(ptr + 3) : 0);
        }
        if ( (sa = rti_info[RTAX_NETMASK]) != NULL) {
                ptr = &sa->sa_data[2];
                printf("netmask: [%u.%u.%u.%u]\n",
                        *ptr ? *ptr : 0,
                        *(ptr + 1) ? *(ptr + 1) : 0,
                        *(ptr + 2) ? *(ptr + 2) : 0,
                        *(ptr + 3) ? *(ptr + 3) : 0);
        }
        if ( (sa = rti_info[RTAX_GENMASK]) != NULL) {
                ptr = &sa->sa_data[2];
                printf("genmask: [%u.%u.%u.%u]\n",
                        *ptr ? *ptr : 0,
                        *(ptr + 1) ? *(ptr + 1) : 0,
                        *(ptr + 2) ? *(ptr + 2) : 0,
                        *(ptr + 3) ? *(ptr + 3) : 0);
        }
        exit(0);
}
/* end getrt2 */
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/3788/showart_450143.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP