gpt4 book ai didi

sockets - 从内核模块发送带有套接字的数据包

转载 作者:行者123 更新时间:2023-12-04 15:45:08 25 4
gpt4 key购买 nike

我正在编写一个内核模块,它应该从用户空间接收消息并通过套接字发回响应。

当程序和模块在同一台机器上时,我使用 IP 127.0.0.1 ,一切正常。但是当我在不同的机器上尝试并使用真实的网络 IP 时,就像 192.168.3.146它仅以一种方式起作用。

我收到来自用户空间的消息,但我无法从内核接收它。我用 sock_sendmsg从内核发送消息的函数,它不返回任何错误。此外,我没有从防火墙收到任何消息,表明某些东西来自另一台机器,来自内核模块。

这里有类似的问题和示例,但它们对我来说不够用,或者示例使用的内核版本太旧。对于骨架,我使用了这个,来自 UDP 套接字:http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-3.html .有什么帮助吗?

发送内核模块代码:

void send_data(unsigned char *data)
{
if(!IS_ERR_OR_NULL(data))
{
int ret;
mm_segment_t oldfs;
struct msghdr message;
struct iovec ioVector;
struct sockaddr_in sendAddr;

sendAddr.sin_family = AF_INET;
sendAddr.sin_addr.s_addr = INADDR_ANY;
//sendAddr.sin_addr.s_addr = in_aton("192.168.1.75");
//here I get port from sk_buff structure that I received.
sendAddr.sin_port = *((unsigned short*)skBuffer->data);

memset(&message, 0, sizeof(message));
message.msg_name = &sendAddr;
message.msg_namelen = sizeof(sendAddr);

/* send the message back */
ioVector.iov_base = data;
ioVector.iov_len = strlen(data);
message.msg_iov = &ioVector;
message.msg_iovlen = 1;
message.msg_control = NULL;
message.msg_controllen = 0;

oldfs = get_fs();
set_fs(KERNEL_DS);
ret = sock_sendmsg(sendSocket, &message, strlen(data));
set_fs(oldfs);
}
}

最佳答案

我找到了另一种解决方案,使用 netpoll 套接字。它比我以前使用过的套接字更容易,并且可以正常工作。答案和正确代码是 here ,关于另一个 StackOverflow 问题。

关于sockets - 从内核模块发送带有套接字的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18124084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com