- 论坛徽章:
- 0
|
读这本书的时候,发现里面的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 |
|