使用Netlink时的问题
本帖最后由 ustcwizard 于 2012-07-22 16:38 编辑一个Netlink套接字的用户态代码Demo:
#include <sys/socket.h>
#include <linux/netlink.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NETLINK_USER 31
#define MAX_PAYLOAD 1024
//struct msghdr msg;
int main(int argc, char *argv[])
{
struct sockaddr_nl src_addr, dest_addr;
struct nlmsghdr *nlh = NULL;
struct msghdr msg;
struct iovec iov;
int sock_fd;
sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_USER);
if( sock_fd<0 )
return -1;
memset(&src_addr, 0, sizeof(src_addr));
src_addr.nl_family = AF_NETLINK;
src_addr.nl_pid = getpid();
bind(sock_fd, (struct sockaddr *)&src_addr, sizeof(src_addr));
memset(&dest_addr, 0, sizeof(dest_addr));
dest_addr.nl_family = AF_NETLINK;
dest_addr.nl_pid = 0;
dest_addr.nl_groups = 0;
nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));
memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));
nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);
nlh->nlmsg_pid = getpid();
nlh->nlmsg_flags = 0;
strcpy(NLMSG_DATA(nlh), "Debug Hello, Kernel!");
iov.iov_base = (void *)nlh;
iov.iov_len = nlh->nlmsg_len;
msg.msg_name = (void *)&dest_addr;
msg.msg_namelen = sizeof(dest_addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
printf("Sending msg to kernel!\n");
sendmsg(sock_fd, &msg, 0);
printf("Waiting for message from kernel\n");
recvmsg(sock_fd, &msg, 0);
printf("Received msg: %s\n", (char *)NLMSG_DATA(nlh));
free( nlh );
nlh = NULL;
close(sock_fd);
return 0;
}
如果把struct msghdr msg定义为全局变量,则成功,若定义为局部变量,即放在main函数中,则失败!
请教各位,原因是什么? 用户态代码发到驱动板块干嘛?:outu: 是和Netlink有关系的回复 2# cdtits
回复 3# ustcwizard
貌似一般来说只要通过外设的东西,都要通过驱动吧。
页:
[1]