標籤:
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 在處理器的儲存保...