从内核模块发送带有套接字的数据包
发布时间:2020-12-14 01:55:15 所属栏目:Linux 来源:网络整理
导读:我正在编写一个内核模块,它应该从用户空间接收消息并通过套接字发回响应. 当程序和模块在同一台机器上并使用IP 127.0.0.1时,一切正常.但是当我在不同的机器上尝试它并使用真正的网络IP时,像192.168.3.146这样只能以一种方式工作. 我从用户空间收到消息,但我
我正在编写一个内核模块,它应该从用户空间接收消息并通过套接字发回响应.
当程序和模块在同一台机器上并使用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,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套接字的替代解决方案.它比套接字更容易,我之前使用它并且它有效.在另一个StackOverflow问题上,答案和正确的代码是
here.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |