C语言 使用套接字api,如何在一个额外的数据结构传递到内核模块的fd ?



我用的是4。有一个内核模块,当我打开一个套接字时,我接收套接字信息。

if ((fd = socket(sai.sin_family, skt_type, skt_protocol)) < 0)
// ...

在这种情况下,我正在使用UDP,在我使用sendto()传输我的第一个数据之前,我希望能够从我的客户端程序传递数据结构到我的内核模块。然后,我可以在协议中添加额外的信息,并将这些数据与文件描述符关联起来。这不是用户数据,相反,它旨在控制我的协议如何运行。

我想传入并关联到套接字的数据结构如下所示:

struct some_tag_info_t {
int field_t;
char field_a[MAX_A];
void *field_b;
};

我有一种感觉,ioctl可能会为我做一些事情,因为它似乎能够用文件描述符操作底层设备参数。

net/socket.c中,ioctl()为:

static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)

在函数之后,我看到了这个注释。

/*
*  With an ioctl, arg may well be a user mode pointer, but we don't know
*  what to do with it - that's up to the protocol still.
*/

似乎我可以使用arg在我的struct some_tag_info_t上面传递?有人能对此发表评论吗?任何想法吗?

您的理解是正确的,您可以从用户空间传递任何东西到ioctl()处理程序,然后由内核模块正确处理您传递的任何命令和参数。但是,由于您正在使用套接字并编写自己的协议,因此通过getsockopt(2)/setsockopt(2)实现此功能更为合适。setsockopt(2)的参数可以是任何您想要的。在用户空间中,您可以这样做:

res = setsockopt(sock_fd, &your_struct, sizeof(your_struct));

相关内容

  • 没有找到相关文章

最新更新