user client
获取netlink 的family id
发送family id 请求消息:
首先向内核发一个family_id的请求消息,根据family name查询family id,在内核注册genl_family demo_family的时候分配一个family id 与family name对应
nlmsg_type = GENL_ID_CTRL
nlmsg_flags = NLM_F_REQUEST
genl_cmd = CTRL_CMD_GETFAMILY
na->nla_type = CTRL_ATTR_FAMILY_NAME
| struct nlmsghdr | struct genlmsghdr | char buf(可以放多个struct nlattr ) |
|---|---|---|
struct nlattr *na;struct sockaddr_nl nladdr;int r, buflen;char *buf;struct msgtemplate msg;/* 填充msg (本函数发送的msg只填充一个attr) */msg.n.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN);msg.n.nlmsg_type = GENL_ID_CTRL; //后面要是在发送其它消息到内核就用到这个消息的响应消息里面的family_idmsg.n.nlmsg_flags = NLM_F_REQUEST;msg.n.nlmsg_seq = 0;msg.n.nlmsg_pid = nlmsg_pid;msg.g.cmd = CTRL_CMD_GETFAMILY; //msg.g.version = DEMO_GENL_VERSION;na = (struct nlattr *) GENLMSG_DATA(&msg);na->nla_type = CTRL_ATTR_FAMILY_NAME; //na->nla_len = nla_len + 1 + NLA_HDRLEN;memcpy(NLA_DATA(na), nla_data, nla_len);msg.n.nlmsg_len += NLMSG_ALIGN(na->nla_len);buf = (char *) &msg;buflen = msg.n.nlmsg_len;memset(&nladdr, 0, sizeof(nladdr));nladdr.nl_family = AF_NETLINK;/* 循环发送直到发送完成 */while ((r = sendto(sd, buf, buflen, 0, (struct sockaddr *) &nladdr,sizeof(nladdr))) < buflen) {if (r > 0) {buf += r;buflen -= r;} else if (errno != EAGAIN)return -1;}
发送普通消息:
nlmsg_type = family_id
nlmsg_flags = NLM_F_REQUEST
genl_cmd = DEMO_CMD_ECHO
na->nla_type = DEMO_CMD_ATTR_MESG
