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

如何从Linux内核进行UDP广播?,linux,networking,module,kernel,Linux,Networking,Module,Kernel,我正在开发一个实验性的Linux内核模块,所以 如何从Linux内核进行UDP广播?Mm,我希望有更多的时间来帮助您 要使UDP多播工作,必须将其烘焙到内核中。您必须在配置内核时启用它。谷歌应该有更多的信息;我希望这能让你走上正轨。-13是每一个。你们有SO_广播机吗?我相信如果没有设置SO_广播,并且您正在发送到广播地址,sock_sendmsg将返回-EACCES 您正在查找错误代码 您开发的内核版本是什么?我想简单地浏览一下内核源代码。我没有看到如何从sock_集合返回-enopokg

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


如何从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);