我想通过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地址。我怎么能这样做?
答案 0 :(得分:3)
检查同一项目中的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);
}