繁体   English   中英

从linux内核模块发送数据

[英]Send data from linux kernel module

我想从我的Linux内核模块通过tcp发送一些数据。 我尝试使用http://www.avrfreaks.net/sites/default/files/tcp-server-send-recv.c中的一些代码,但是代码太旧了(它使用了旧的Linux内核api)。 另外,我试图理解https://github.com/abysamross/simple-linux-kernel-tcp-client-server/blob/master/network_server.c ,但对我来说太复杂了:)

我只想通过TCP将一些小数据发送到指定的IP地址。 我该怎么办?

检查同一项目中的客户端示例 如果可以重用某些功能,则必须仅理解和修改tcp_client_connect函数(第124-198行)。 在该模块中, tcp_client_connect连接在模块加载时创建一个连接,而network_client_exit在模块卸载时关闭该连接。

tcp_client_connect函数中:

  1. (第144行)它创建了一个套接字

      struct socket *conn_socket = NULL; ret = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &conn_socket); 
  2. 然后,(第153至155行)创建了目标地址

      struct sockaddr_in saddr; /* a socket address */ saddr.sin_family = AF_INET; /* for internet */ saddr.sin_port = htons(PORT); /* using the port PORT */ saddr.sin_addr.s_addr = htonl(create_address(destip)); /* and address destip */ 
  3. (第157行)它使用该地址打开套接字(以创建连接)

      int ret = -1; ret = conn_socket->ops->connect(conn_socket, (struct sockaddr *)&saddr\\ , sizeof(saddr), O_RDWR); /* if it gets a response and it is not "in progress" */ if(ret && (ret != -EINPROGRESS)) { /* error creating the socket*/ } 
  4. (第166至168行)它使用套接字发送消息。

     int len = 49; char reply[len+1]; memset(&reply, 0, len+1); /* sets 0s into all the string space */ strcat(reply, "HOLA"); /* sets the message */ tcp_client_send(conn_socket, reply, strlen(reply), MSG_DONTWAIT); 
  5. (第170行)等待消息(一段时间)

     DECLARE_WAIT_QUEUE_HEAD(recv_wait); /* wait for a response or for a timetout */ wait_event_timeout(recv_wait,\\ !skb_queue_empty(&conn_socket->sk->sk_receive_queue),\\ 5*HZ); 
  6. (180至190行)获得响应。

     int len = 49; char response[len+1]; /* if something has arrived */ if(!skb_queue_empty(&conn_socket->sk->sk_receive_queue)) { memset(&response, 0, len+1); tcp_client_receive(conn_socket, response, MSG_DONTWAIT); } 

network_client_exit函数中,

  1. (第239至240行)关闭了连接。

     /* if the socket has been created */ if(conn_socket != NULL) { /* relase the socket */ sock_release(conn_socket); } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM