- 論壇徽章:
- 0
|
現(xiàn)在需要及時獲取網(wǎng)線拔出的事件作一些處理,由于不想循環(huán)查詢網(wǎng)口狀態(tài),所以希望能的到網(wǎng)線拔出的事件,方便處理
對netlink了解不多,網(wǎng)上找到一個參考,但是現(xiàn)在網(wǎng)線拔出,網(wǎng)口up,down,設置IP這些事件混在一起了,不知道如何區(qū)分出來網(wǎng)線拔出的動作,還請各位指教,或者有其他方法也請?zhí)崾鞠?
參考的http://www.ibm.com/developerworks/cn/linux/l-kerns-usrs/里代碼里的例子 netlink-exam-user-recv.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 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));
- 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));
- }
-
- close(sd);
- }
復制代碼 這里不知道recvmsg后如何對msg結(jié)構(gòu)判斷得到網(wǎng)線拔出的動作 |
|