posts - 63, comments - 37, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 ::  :: 管理

netlink userspace code

Posted on 2006-06-20 11:37 Enjoy Life 阅读(277) 评论(0)  编辑 收藏 引用 所属分类: Linux Programming Doc
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <asm/types.h>
#include <linux/netlink.h>
/*
#include <linux/rtnetlink.h>
#include <linux/netdevice.h>
#include <net/if_arp.h>
#include <netinet/if_ether.h>
#include <netinet/ether.h>
*/



#define MAX_PAYLOAD 1024  /* maximum payload size*/

struct sockaddr_nl src_addr, dest_addr;

struct nlmsghdr *nlh = NULL;
struct msghdr msg;

struct iovec iov;

int sock_fd;

void main() {

 sock_fd = socket(PF_NETLINK, SOCK_RAW,16);

 memset(&src_addr, 0, sizeof(src_addr));

 src_addr.nl_family = AF_NETLINK;    

 src_addr.nl_pid = getpid();  /* self pid */

 src_addr.nl_groups = 0;  /* not in mcast groups */

 bind(sock_fd, (struct sockaddr*)&src_addr,sizeof(src_addr));

 memset(&dest_addr, 0, sizeof(dest_addr));

 dest_addr.nl_family = AF_NETLINK;

 dest_addr.nl_pid = 0;   /* For Linux Kernel */

 dest_addr.nl_groups = 0; /* unicast */

 nlh=(struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));

 /* Fill the netlink message header */

 nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);

 nlh->nlmsg_pid = getpid();  /* self pid */

 nlh->nlmsg_flags = 0;

 /* Fill in the netlink message payload */

 strcpy(NLMSG_DATA(nlh), "Hello you!");

 iov.iov_base = (void *)nlh;

 iov.iov_len = nlh->nlmsg_len;

 msg.msg_name = (void *)&dest_addr;

 msg.msg_namelen = sizeof(dest_addr);

 msg.msg_iov = &iov;

 msg.msg_iovlen = 1;

 sendmsg(sock_fd, &msg, 0);

 /* Read message from kernel */

 memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));

 recvmsg(sock_fd, &msg, 0);

 printf(" Received message payload: %s\n",

        NLMSG_DATA(nlh));

  

 /* Close Netlink Socket */

 close(sock_fd);

}
只有注册用户登录后才能发表评论。