Извлечь текущий маршрут из сообщения netlink, код прилагается

Я пытаюсь отслеживать изменения маршрута с помощью сокета netlink, но как мне получить обновленный адрес маршрута?

Код:

#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#define ERR_RET(x) do { perror(x); return EXIT_FAILURE; } while (0);

void loop (int sock)
{
    struct sockaddr_nl nladdr;
    struct msghdr msg;
    struct iovec iov[2];
    struct nlmsghdr nlh;
    char buffer[65536];

    iov[0].iov_base = (void *)&nlh;
    iov[0].iov_len = sizeof(nlh);
    iov[1].iov_base = (void *)buffer;
    iov[1].iov_len = sizeof(buffer);

    msg.msg_name = (void *)&(nladdr);
    msg.msg_namelen = sizeof(nladdr);
    msg.msg_iov = iov;
    msg.msg_iovlen = sizeof(iov)/sizeof(struct iovec);

    if ( recvmsg (sock, &msg, 0) )
    {
        if ( nlh.nlmsg_type == RTM_NEWROUTE )
        {
            printf ("New route message\n");
        }
        else if ( nlh.nlmsg_type == RTM_DELROUTE )
        {
            printf ("Del route message\n");
        }
    }
}

int main(int argc, char *argv[])
{
    int sock = -1;
    struct sockaddr_nl addr;
    bzero (&addr, sizeof(addr));

    if ( (sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE) ) < 0 )
        ERR_RET("socket");

    addr.nl_family = AF_NETLINK;
    addr.nl_groups = RTMGRP_IPV4_ROUTE;

    if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0)
        ERR_RET("bind");

    while (1)
        loop (sock);
    return 0;
}
9
задан leppie 5 August 2012 в 16:51
поделиться