Linux 核心態 Socket TCP 程式設計

2021-07-11 09:02:50 字數 3983 閱讀 2349

標籤

linux c++ socket程式設計

c++ sock

linux下socket c++

**

1.核心態 socket api

核心態socket程式設計的過程和使用者態下的socket程式設計流程一樣,但是介面不同。kernel提供了一組核心態的socket api,基本上在使用者態的sockt api在核心中都有對應的api。 在net/socket.c中可以看到如下匯出符號:

view plain

export_symbol(kernel_sendmsg);    

export_symbol(kernel_recvmsg);    

export_symbol(sock_create_kern);    

export_symbol(sock_release);    

export_symbol(kernel_bind);    

export_symbol(kernel_listen);    

export_symbol(kernel_accept);    

export_symbol(kernel_connect);    

export_symbol(kernel_getsockname);    

export_symbol(kernel_getpeername);    

export_symbol(kernel_getsockopt);    

export_symbol(kernel_setsockopt);    

export_symbol(kernel_sendpage);    

export_symbol(kernel_sock_ioctl);    

export_symbol(kernel_sock_shutdown);   

下面以兩個核心模組間利用socket進行通訊為例來講述核心態下socket程式設計。

server核心模組功能是:建立套接字,繫結埠,監聽埠,等待client的連線,並接收client發來的資料。

client核心模組功能是:建立套接字,和server建立連線,並向server傳送資料。

2. server模組

view plain

/*server.c*/

#include

#include

#include

#include

#include

#include

intmyserver(

void

)  printk("server:socket_create ok!\n"

);  

/*bind the socket*/

ret=sock->ops->bind(sock,(struct

sockaddr *)&s_addr,

sizeof

(struct

sockaddr_in));  

if(ret<0)  

printk("server:bind ok!\n"

);  

/*listen*/

ret=sock->ops->listen(sock,10);  

if(ret<0)  

printk("server:listen ok!\n"

);  

ret=sock->ops->accept(sock,client_sock,10);if

(ret<0)  

printk("server: accept ok, connection established\n"

);  

/*kmalloc a receive buffer*/

char

*recvbuf=null;  

recvbuf=kmalloc(1024,gfp_kernel);  

if(recvbuf==null)  

memset(recvbuf, 0, sizeof

(recvbuf));  

/*receive message from client*/

struct

kvec vec;  

struct

msghdr msg;  

memset(&vec,0,sizeof

(vec));  

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*/

printk("receive message:\n %s\n"

,recvbuf);  

/*release socket*/

sock_release(sock);  

sock_release(client_sock);  

return

ret;  

}  static

intserver_init(

void

)  static

void

server_exit(

void

)  module_init(server_init);  

module_exit(server_exit);  

module_license("gpl"

);  

3.client模組 

view plain

/*client.c*/

#include

#include

#include

#include

#include

#include

intmyclient(

void

)  printk("client: socket create ok!\n"

);  

/*connect server*/

ret=sock->ops->connect(sock,(struct

sockaddr *)&s_addr, 

sizeof

(s_addr),0);  

if(ret!=0)  

printk("client:connect ok!\n"

);  

/*kmalloc sendbuf*/

char

*sendbuf=null;  

sendbuf=kmalloc(1024,gfp_kernel);  

if(sendbuf==null)  

memset(sendbuf,1,1024);          

struct

kvec vec;  

struct

msghdr msg;  

vec.iov_base=sendbuf;  

vec.iov_len=1024;  

memset(&msg,0,sizeof

(msg));  

ret=kernel_sendmsg(sock,&msg,&vec,1,1024); /*send message */

if(ret<0)else

if(ret!=1024)  

printk("client:send ok!\n"

);  

return

ret;  

}  static

intclient_init(

void

)  static

void

client_exit(

void

)  module_init(client_init);  

module_exit(client_exit);  

module_license("gpl"

);  

Linux 核心態檔案操作

在vfs的支援下,使用者態程序讀寫任何型別的檔案系統都可以使用read和write著兩個系統呼叫,但是在linux核心中沒有這樣的系統呼叫我們如何操作檔案呢?我們知道read和write在進入核心態之後,實際執行的是sys read和sys write,但是檢視核心源 發現這些操作檔案的函式都沒有匯...

linux核心態使用者態

概述 linux系統使用者態和核心態相關知識,linux核心版本為3.10.79。使用者態和核心態定義 核心態 cpu可以訪問記憶體所有資源,包括外圍裝置.可以進行處理器工作模式切換,程式的切換。使用者態 只能受限的訪問記憶體,且不允許訪問外圍裝置,不可以進行處理器模式切換。為什麼分使用者態和核心態...

Linux 核心態與使用者態

使用者態 ring3 執行於使用者態的 則要受到處理器的諸多檢查,它們只能訪問對映其位址空間的頁表項中規定的在使用者態下可訪問頁面的虛擬位址,且只能對任務狀態段 tss 中i o 許可位圖 i o permission bitmap 中規定的可訪問埠進行直接訪問 核心態 ring0 在處理器的儲存保...