如何从Linux内核进行UDP广播?
我正在开发一个实验性的Linux内核模块,所以如何从Linux内核进行UDP广播?,linux,networking,module,kernel,Linux,Networking,Module,Kernel,我正在开发一个实验性的Linux内核模块,所以 如何从Linux内核进行UDP广播?Mm,我希望有更多的时间来帮助您 要使UDP多播工作,必须将其烘焙到内核中。您必须在配置内核时启用它。谷歌应该有更多的信息;我希望这能让你走上正轨。-13是每一个。你们有SO_广播机吗?我相信如果没有设置SO_广播,并且您正在发送到广播地址,sock_sendmsg将返回-EACCES 您正在查找错误代码 您开发的内核版本是什么?我想简单地浏览一下内核源代码。我没有看到如何从sock_集合返回-enopokg
如何从Linux内核进行UDP广播?Mm,我希望有更多的时间来帮助您
要使UDP多播工作,必须将其烘焙到内核中。您必须在配置内核时启用它。谷歌应该有更多的信息;我希望这能让你走上正轨。-13是每一个。你们有SO_广播机吗?我相信如果没有设置SO_广播,并且您正在发送到广播地址,sock_sendmsg将返回-EACCES
您正在查找错误代码
您开发的内核版本是什么?我想简单地浏览一下内核源代码。我没有看到如何从sock_集合返回-enopokg,但我确实看到了可以返回-enoprotoop(内核2.6.27中的errno 92) 哦--如果你愿意的话,把这段代码重新发布到你设置的地方。我没有记下来,我想再看一遍
试着用SOL_UDP调用它。我想这就是你要找的。我没有一个2.6.18构建环境设置可以在任何地方玩这个,但是试一试 不,没关系,那不是你想要的。我应该读得更深入一些。我会继续找的。这很有趣
我想你可以自己设置广播标志!微笑
你把我难住了,我得去睡觉了。我确实发现了这段代码可能会有所帮助,尽管这些人不做广播 祝你好运,我真希望我能帮你解决这个问题。@ 事实上,我刚刚得到它。当我设置SO_广播时,我收到92(未安装软件包) 那么,我应该安装什么软件包呢
编辑:内核版本是2.6.18,你说得对!92是
enoprotoop
//Socket creation
sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
//Broadcasting
int broadcast = 1;
int err;
if( (err = sock->ops->setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof broadcast)) < 0 )
{
printk(KERN_ALERT MODULE_NAME ": Could not configure broadcast, error %d\n", err);
return -1;
}
这方面我真的需要一些帮助。看看linux内核中的IPVS(linux虚拟服务器)代码。它已经有一个UDP多播的工作实现,它使用它来共享故障转移的连接状态
我已经了解了这一点,并且知道一些人已经这样做了,我真的建议创建一个netfilter链接,并使用用户空间守护进程在网络上广播信息。以下内容对我有效(因此最后可以关闭此线程)
这里sock是一个初始化的结构套接字,addr应该是struct sockaddr_in,其中包含一个广播地址。这对用户空间和内核空间都有效吗?我可以在用户空间中广播,但不能在内核空间中广播。
//Socket creation
sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
//Broadcasting
int broadcast = 1;
int err;
if( (err = sock->ops->setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof broadcast)) < 0 )
{
printk(KERN_ALERT MODULE_NAME ": Could not configure broadcast, error %d\n", err);
return -1;
}
sock->sk->sk_flags |= SO_BROADCAST;
int yes = 1;
sock_setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));
sock->ops->connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr), 0);