kernel_socket 和 应用socket通讯

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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值