免费注册 查看新帖 |

Chinaunix

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

关于netlink socket的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-20 00:12 |只看该作者 |倒序浏览
netlink socket可以使用select函数么

我在应用程序中创建了一个netlink socket, 用想用select(fd + 1, &fdRead, 0, 0, &tv)来看当前有没有从内核发来消息,有的话再用recvmsg()函数接收,但是我发现select函数始终不能返回正数。直接用recvmsg()可以收到消息,但是我不想程序被阻塞。

哪位高手有好的解决方法,谢了先

论坛徽章:
0
2 [报告]
发表于 2008-12-20 00:32 |只看该作者
使用perror打印一下出错原因呢。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2008-12-20 09:43 |只看该作者
可以使用的。LZ可以参考一下iptables实现代码中libipq.c和libipq.h,这个里面是封装了基于Netlink的IP Queue机制,里面使用了select机制。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-12-20 09:47 |只看该作者
iptables的libipq.c中的代码:

  1. static ssize_t ipq_netlink_recvfrom(const struct ipq_handle *h,
  2.                                     unsigned char *buf, size_t len,
  3.                                     int timeout)
  4. {
  5.         int addrlen, status;
  6.         struct nlmsghdr *nlh;

  7.         if (len < sizeof(struct nlmsgerr)) {
  8.                 ipq_errno = IPQ_ERR_RECVBUF;
  9.                 return -1;
  10.         }
  11.         addrlen = sizeof(h->peer);

  12.         if (timeout != 0) {
  13.                 int ret;
  14.                 struct timeval tv;
  15.                 fd_set read_fds;
  16.                
  17.                 if (timeout < 0) {
  18.                         /* non-block non-timeout */
  19.                         tv.tv_sec = 0;
  20.                         tv.tv_usec = 0;
  21.                 } else {
  22.                         tv.tv_sec = timeout / 1000000;
  23.                         tv.tv_usec = timeout % 1000000;
  24.                 }

  25.                 FD_ZERO(&read_fds);
  26.                 FD_SET(h->fd, &read_fds);
  27.                 ret = select(h->fd+1, &read_fds, NULL, NULL, &tv);
  28.                 if (ret < 0) {
  29.                         if (errno == EINTR) {
  30.                                 return 0;
  31.                         } else {
  32.                                 ipq_errno = IPQ_ERR_RECV;
  33.                                 return -1;
  34.                         }
  35.                 }
  36.                 if (!FD_ISSET(h->fd, &read_fds)) {
  37.                         ipq_errno = IPQ_ERR_TIMEOUT;
  38.                         return 0;
  39.                 }
  40.         }
  41.         status = recvfrom(h->fd, buf, len, 0,
  42.                               (struct sockaddr *)&h->peer, &addrlen);
  43.         if (status < 0) {
  44.                 ipq_errno = IPQ_ERR_RECV;
  45.                 return status;
  46.         }
  47.         if (addrlen != sizeof(h->peer)) {
  48.                 ipq_errno = IPQ_ERR_RECV;
  49.                 return -1;
  50.         }
  51.         if (h->peer.nl_pid != 0) {
  52.                 ipq_errno = IPQ_ERR_RECV;
  53.                 return -1;
  54.         }
  55.         if (status == 0) {
  56.                 ipq_errno = IPQ_ERR_NLEOF;
  57.                 return -1;
  58.         }
  59.         nlh = (struct nlmsghdr *)buf;
  60.         if (nlh->nlmsg_flags & MSG_TRUNC || nlh->nlmsg_len > status) {
  61.                 ipq_errno = IPQ_ERR_RTRUNC;
  62.                 return -1;
  63.         }
  64.         return status;
  65. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2008-12-20 21:03 |只看该作者
在应用层netlink与普通的socket没有任何区别

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
6 [报告]
发表于 2008-12-21 14:23 |只看该作者
原帖由 emmoblin 于 2008-12-20 21:03 发表
在应用层netlink与普通的socket没有任何区别


netlink就是使用socket通信的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP