如何从Linux内核进行UDP广播?

我正在开发一个实验性的Linux内核模块 ,所以…

如何从Linux内核进行UDP广播

-13是-EACCES。 你有SO_BROADCAST吗? 我相信sock_sendmsg返回-EACCES如果SO_BROADCAST没有设置,你正在发送到广播地址。


你正在寻找错误代码<errno.h>。


你正在开发什么内核版本? 我想简单浏览一下内核源代码。 我没有看到-ENOPKG是如何从sock_set返回的,但是我确实看到-ENOPROTOOPT可以返回(在内核2.6.27中是errno 92)。

噢,如果你愿意的话,你可以在SO_BROADCAST的地方重新发布一些代码。 我没有记下来,我想再看一遍。


尝试使用SOL_UDP调用它。 我这就是你要找的。 我没有2.6.18的编译环境设置在任何地方玩这个,但是给一个镜头。

不 – 不要 – 不要 – 这不会做你想做的事情。 我应该从源头上进一步阅读。 我会继续寻找。 这很有趣。


我想你可以自己设置广播标志! 微笑

lock_sock(sock->sk); sock->sk->broadcast = 1; release_sock(sock->sk); 

你让我难住了,我得去睡觉。 我确实发现了一些可能有所帮助的代码,尽管这些人没有做广播。

http://kernelnewbies.org/Simple_UDP_server

祝你好运 – 我希望我能为你解决这个问题。

@adjuster ..

实际上,我刚刚得到了它。 当我设置SO_BROADCAST ,我收到92(包未安装)

那么我应该安装什么软件包?


编辑:内核版本是2.6.18,你是对的! 92是ENOPROTOOPT

 //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; } 

编辑:我从setsockopt 手册页得到这个…

ENOPROTOOPT
该选项在所示级别是未知的。

…所以,我认为SOL_SOCKET不是正确的值传递。 我也试过IPPROTO_UDP而不是SOL_SOCKET ,没有运气。


编辑: http : //docs.hp.com/en/32650-90372/ch02s10.html说SO_BROADCASTSOL_SOCKET级别的一个选项,但我继续得到-92


编辑:我绝望,所以我已经尝试SOL_UDP ,仍然-92。
是的,这很有趣:) …良好的协同作用! 最后(希望我们很快到达)让我们组装一个明确的答案干净,好! 🙂


编辑:即使硬设置广播标志, sock_sendmsg将失败(-13,“权限被拒绝”)

 sock->sk->sk_flags |= SO_BROADCAST; 

我真的需要这个帮助

嗯,我希望我有更多的时间来帮助你。

要使UDP组播工作,它必须被烘焙到你的内核中。 您必须在配置内核时启用它。 谷歌应该有更多的信息; 我希望这能让你走上正轨。

查看Linux内核中的IPVS(linux虚拟服务器)代码。 它已经有了UDP多播的工作实现,它使用共享连接状态进行故障转移。

已经看过这个,知道一些人做了这个,我真的建议创建一个netfilter链接,并使用用户空间守护进程通过网络广播信息。

以下为我工作(所以最后这个线程可能被关闭)。

 int yes = 1; sock_setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes)); sock->ops->connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr), 0); 

这里sock是一个初始化的结构套接字 ,addr应该是struct sockaddr_in,里面有一个广播地址。