kernel创建TCP的socket
并创建接受线程
/*server.c*/
#include<linux/in.h>
#include<linux/inet.h>
#include<linux/socket.h>
#include<net/sock.h>
#include<linux/init.h>
#include<linux/module.h>
#include <linux/sched.h> //wake_up_process()
#include <linux/kthread.h> //kthread_create()、kthread_run()
#include <linux/err.h> //IS_ERR()、PTR_ERR()
struct socket *sock = NULL;
struct socket *client_sock = NULL;
char recvbuf[1024] = {0};
static struct task_struct *test_task;
int myserver(void*data){
struct sockaddr_in s_addr;
unsigned short portnum=0x8899;
int ret=0;
struct kvec vec;
struct msghdr msg;
memset(&s_addr,0,sizeof(s_addr));
s_addr.sin_family=AF_INET;
s_addr.sin_port=htons(portnum);
s_addr.sin_addr.s_addr=htonl(INADDR_ANY);
/*create a socket*/
ret=sock_create_kern(AF_INET, SOCK_STREAM,0,&sock);
if(ret){
printk("server:socket_create error = %d\n",ret);
return -1;
}
printk("server: socket_create ok!\n");
/*bind the socket*/
ret=kernel_bind(sock, (struct sockaddr *)&s_addr, sizeof(s_addr));
if (ret< 0) {
printk("server: bind error = %d\n",ret);
goto err0;
}
printk("server: bind ok!\n");
/*listen*/
ret=kernel_listen(sock, 5);
if(ret<0){
printk("server: listen error = %d\n",ret);
goto err0;
}
printk("server: listen ok!\n");
/*accept*/
for(;;)
{
ret=kernel_accept(sock, &client_sock, 0);
if (ret<0) {
printk("server: accept error = %d\n",ret);
goto err0;
}
printk("server: accept ok!\n");
/*receive message from client*/
for(;;)
{
memset(&msg,0,sizeof(msg));
vec.iov_base=recvbuf;
vec.iov_len=1024;
ret=kernel_recvmsg(client_sock,&msg,&vec,1,1024,0); /*receive message*/
if(ret<=0){
printk("server: receive message error = %d\n",ret); /*Connection is broken*/
break;
}
printk("server: receive len=%d message: %s\n",ret,recvbuf);
}
}
/*release socket*/
//sock_release(client_sock);
err0: sock_release(sock);
return ret;
}
static int socket_send(char* data ,int len)
{
int length = 0;
struct kvec vec;
struct msghdr msg;
memset(&msg,0,sizeof(msg));
vec.iov_base=data;
vec.iov_len=len;
if(client_sock->state != SS_CONNECTED)
{
printk("server: send not accept\n");
return -1;
}
length=kernel_sendmsg(client_sock,&msg,&vec,1,len); /*send message */
if(length<0){
printk("server: kernel_sendmsg error = %d\n",length);
return -2;
}
printk("server: send len=%d message: %s\n",length,data);
return 0;
}
static int test_init_module(void)
{
int err,i;
test_task = kthread_create(myserver, NULL, "ble_socket_task");
if(IS_ERR(test_task)){
printk("server: unable to start kernel thread.\n");
err = PTR_ERR(test_task);
test_task = NULL;
return err;
}
wake_up_process(test_task);
for(i=0;i<5;i++)
{
ssleep(10); //seconds
socket_send("aaa123",6);
}
return 0;
}
static void test_cleanup_module(void)
{
if(test_task){
kthread_stop(test_task);
test_task = NULL;
printk("server: kthread stop\n");
}
}
static int server_init(void){
printk("server: init\n");
return (test_init_module());
}
static void server_exit(void){
test_cleanup_module();
printk("server: good bye\n");
}
module_init(server_init);
module_exit(server_exit);
MODULE_LICENSE("GPL");
模块卸载会出错,线程卸载不掉.还需修改
------------------------------------------------------------------------
linux应用端创建client的socket
并且创建接受的线程
/*client.c*/
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <pthread.h>
int cfd = -1;
char buffer[1024]={0};
unsigned short portnum=0x8899;
char senddata[] = {"hello,welcome to my server \r\n"};
void *thrd_socket(void *arg)
{
int recbytes;
struct sockaddr_in s_add;
printf("Hello,welcome to client !\r\n");
cfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == cfd)
{
printf("socket fail ! \r\n");
goto err0;
}
printf("socket ok !\r\n");
bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr= inet_addr("127.0.0.1");
s_add.sin_port=htons(portnum);
printf("s_addr = %#x ,port : %#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port);
if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
{
printf("connect fail !\r\n");
goto err1;
}
printf("connect ok !\r\n");
while(1)
{
if(-1 == (recbytes = read(cfd,buffer,1024)))
{
printf("read data fail !\r\n");
goto err1;
}
printf("read len=%d ok\r\nREC:\r\n",recbytes);
buffer[recbytes]='\0';
printf("%s\r\n",buffer);
}
err1:
close(cfd);
err0:
printf("pthread_exit\n");
pthread_exit(NULL);
}
static int send_data_socket(char* data,int len)
{
if(cfd == -1)
return -1;
if(-1 == write(cfd,data,len))
{
printf("write fail!\r\n");
return -1;
}
printf("write ok!\r\n");
return 0;
}
int main()
{
int i;
pthread_t tid;
if (pthread_create(&tid,NULL,thrd_socket,NULL)!=0)
{
printf("Create thread error!\n");
return -1;
}
for(i=0;i<5;i++)
{
sleep(5);
send_data_socket("12345",5);
}
return 0;
}