我想通过 tcp 从我的 linux 内核模块发送一些数据。 我尝试使用来自 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 地址。我该怎么做?
最佳答案
检查 client example在同一个项目中。如果您可以重用某些功能,则必须仅了解和修改 tcp_client_connect
功能(第 124-198 行)。在该模块中,tcp_client_connect
连接在加载模块时创建连接,而 network_client_exit
在卸载模块时关闭连接。
在tcp_client_connect
函数中:
(第 144 行)它创建一个套接字
struct socket *conn_socket = NULL; ret = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &conn_socket);
然后,(第 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 */
(第 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*/ }
(第 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);
(第 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);
(第 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
函数中,
(第 239 到 240 行)它关闭连接。
/* if the socket has been created */ if(conn_socket != NULL) { /* relase the socket */ sock_release(conn_socket); }
关于c - 从 linux 内核模块发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46573001/