lose 发表于 2007-12-25 22:01

修改UNIX® Network Programming中routing socket的程序


                读这本书的时候,发现里面的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;    /* 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, &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) != NULL) {
                ptr = &sa->sa_data;
                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) != NULL) {
                ptr = &sa->sa_data;
                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) != NULL) {
                ptr = &sa->sa_data;
                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) != NULL) {
                ptr = &sa->sa_data;
                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
页: [1]
查看完整版本: 修改UNIX® Network Programming中routing socket的程序