免费注册 查看新帖 |

Chinaunix

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

netlink的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-01 11:23 |只看该作者 |倒序浏览
内核模块:

  1. static unsigned int watch_in(unsigned int hooknum,
  2.                  struct sk_buff **skb,
  3.                  const struct net_device *in,
  4.                  const struct net_device *out,
  5.                  int (*okfn)(struct sk_buff *))
  6. {
  7. send_to_user(skb);
  8.   return NF_ACCEPT;
  9. }
  10. static int send_to_user(struct sk_buff **data)
  11. {
  12. struct sk_buff *skb;
  13.    int size;
  14.    unsigned char *old_tail;
  15.    struct nlmsghdr *nlh;
  16.    struct packet_info *packet;
  17.   
  18. size = NLMSG_SPACE(1518);
  19.    skb = alloc_skb(size, GFP_ATOMIC);
  20.   old_tail = skb->tail;
  21.    nlh = NLMSG_PUT(skb, 0, 0, 1, size-sizeof(*nlh));
  22.   packet = NLMSG_DATA(nlh);
  23.    memset(packet, (*data)->data, (*data)->len);
  24.    nlh->nlmsg_len = skb->tail - old_tail;
  25. NETLINK_CB(skb).pid = 0;
  26. NETLINK_CB(skb).dst_pid = 0;
  27. NETLINK_CB(skb).dst_group = 1;
  28. netlink_broadcast(vps_sock, skb, 0, 1, GFP_KERNEL);
  29. printk("send %d.\n",(*data)->len);
  30. return 0;
  31. nlmsg_failure: /*若发送失败,则撤销套接字缓存*/
  32. if(skb)
  33.       kfree_skb(skb);
  34. return -1;
  35. }
复制代码


接受模块:

  1. int main(void)
  2. {
  3.         struct sockaddr_nl saddr, daddr;
  4.         struct nlmsghdr *nlhdr = NULL;
  5.         struct msghdr msg;
  6.         struct iovec iov;
  7.         int sd;
  8.         int ret = 1;
  9. struct packet_ret packet_ret;

  10.         sd = socket(AF_NETLINK, SOCK_RAW,NETLINK_VPS);
  11.         memset(&saddr, 0, sizeof(saddr));
  12.         memset(&daddr, 0, sizeof(daddr));
  13.         saddr.nl_family = AF_NETLINK;      
  14.         saddr.nl_pid = getpid();
  15.         saddr.nl_groups = 1;
  16.         bind(sd, (struct sockaddr*)&saddr, sizeof(saddr));
  17.         nlhdr = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_MSGSIZE));
  18.         while (1) {
  19.                 memset(nlhdr, 0, NLMSG_SPACE(MAX_MSGSIZE));
  20.                 iov.iov_base = (void *)nlhdr;
  21.                 iov.iov_len = NLMSG_SPACE(MAX_MSGSIZE);
  22.                 msg.msg_name = (void *)&daddr;
  23.                 msg.msg_namelen = sizeof(daddr);
  24.                 msg.msg_iov = &iov;
  25.                 msg.msg_iovlen = 1;
  26.                 ret = recvmsg(sd, &msg, 0);
  27.                 if (ret == 0) {
  28.                         printf("Exit.\n");
  29.                         exit(0);
  30.                 }
  31.                 else if (ret == -1) {
  32.                         perror("recvmsg:");
  33.                         exit(1);
  34.                 }
  35.                 print_ip_packet(NLMSG_DATA(nlhdr));
  36.                 packet_ret.len = 4;
  37.                 packet_ret.flag = 1;
  38.                 packet_ret.data = NULL;
  39.                 send_to_kernel(sd, &packet_ret);
  40.         }
  41. close(sd);
  42. }
复制代码

接收到的数据不正确,刚开始用netlink,还不熟,多谢指导。

论坛徽章:
0
2 [报告]
发表于 2007-03-01 13:02 |只看该作者
搞定了:)
搞定了:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP