⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netlink-exam-user-recv.c

📁 通过这些实例
💻 C
字号:
//application receiver: netlink-exam-user-recv.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>		//========================
#include <linux/netlink.h>	//========================

#define MAX_MSGSIZE 1024


int main(void)
{/* struct sockaddr_nl{  sa_family_t    nl_family;  unsigned short nl_pad;		//default is 0  __u32          nl_pid;  __u32          nl_groups;};	struct nlmsghdr		//为 netlink socket 自己的消息头,netlink 控制块{  __u32 nlmsg_len;   //Length of message   __u16 nlmsg_type;  // Message type  __u16 nlmsg_flags; // Additional flags   __u32 nlmsg_seq;   // Sequence number   __u32 nlmsg_pid;   // Sending process PID };*/
        struct sockaddr_nl saddr, daddr;
        struct nlmsghdr *nlhdr = NULL;
        struct msghdr msg;
        struct iovec iov;
        int sd;
        int ret = 1;

        sd = socket(AF_NETLINK, SOCK_RAW,NETLINK_GENERIC);	//===============
        memset(&saddr, 0, sizeof(saddr));
        memset(&daddr, 0, sizeof(daddr));

        saddr.nl_family = AF_NETLINK;      
        saddr.nl_pid = getpid();
        saddr.nl_groups = 1;
        bind(sd, (struct sockaddr*)&saddr, sizeof(saddr));	//===============

        nlhdr = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_MSGSIZE));//宏NLMSG_SPACE(len)返回不小于NLMSG_LENGTH(len)且字节对齐的最小数值,它也用于分配消息缓存

        while (1) {
                memset(nlhdr, 0, NLMSG_SPACE(MAX_MSGSIZE));

                iov.iov_base = (void *)nlhdr;
                iov.iov_len = NLMSG_SPACE(MAX_MSGSIZE);
                msg.msg_name = (void *)&daddr;
                msg.msg_namelen = sizeof(daddr);
                msg.msg_iov = &iov;
                msg.msg_iovlen = 1;

                ret = recvmsg(sd, &msg, 0);		//===========================
                if (ret == 0) {
                        printf("Exit.\n");
                        exit(0);
                }
                else if (ret == -1) {
                        perror("recvmsg:");
                        exit(1);
                }		
                printf("%s", NLMSG_DATA(nlhdr));//宏NLMSG_DATA(nlh)用于取得消息的数据部分的首地址,设置和读取消息数据部分时需要使用该宏。
        }
 
        close(sd);		//======================================
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -