setsockopt的工作流程(從使用者空間到核心)

2021-07-16 08:29:00 字數 1888 閱讀 5328

一、使用者空間

獲取套介面選項:

1.  int getsockopt ( int sockfd, int level, int optname, void * optval, socklen_t *opteln ) 設定套介面選項:

2.  int setsockopt ( int sockfd, int level, int optname, const void * optval, socklen_t *opteln )

二、核心空間

系統呼叫setsockopt是通過核心sys_setsockopt

函式實現的

asmlinkage long sys_setsockopt(

int fd,

int level,

int optname, char __user *optval,

int optlen)

return err;}

假如我們定義的套介面是ipproto_ip=0,所以我們將呼叫sol_ip套介面,err=sock->ops->setsockopt(sock, level, optname, optval, optlen),該鉤子為proto_ops型別,所以它指向了我們註冊的inet_stream_ops鉤子,所以setsockopt指向了sock_common_setsockopt函式(net/core/sock.c)

在net/ipv4/af_inet.c檔案中,函式inet_init註冊了inetsw_array

陣列 for(q = inetsw_array; q <

&inetsw_array[inetsw_array_len];+

+q)inet_register_protosw(q);

static struct inet_protosw inetsw_array=

,……};

譬如它註冊了inet_stream_ops針對tcp協議

const struct proto_ops inet_stream_ops =;

現在我們看介面函式sock_common_setsockopt

int sock_common_setsockopt(struct socket *sock,

int level,

int optname,

char __user *optval,

int optlen)

由於sk->sk_prot是指向協議的鉤子,如果它指向了tcp協議鉤子,setsockopt指向了tcp_setsockopt函式(net/ipv4/tcp.c)

struct proto tcp_prot =

int tcp_setsockopt(struct sock *sk,

int level,

int optname, char __user *optval,

int optlen)

如果註冊時sol_ip則由於isck->isck_af_ops是inet_connection_sock_af_ops型別的鉤子,此鉤子的註冊為

struct inet_connection_sock_af_ops ipv4_specific =;

註冊ip_setsockopt(net/ipv4/tcp_ipv4.c

)介面

int ip_setsockopt(struct sock *sk,

int level,

int optname, char __user *optval,

int optlen)

#endif

return err;}

到此我們知道了如果註冊時ipproto_ip最終會呼叫do_ip_setsockopt和nf_setsockopt函式

如果註冊了ipproto_tcp最終會呼叫do_tcp_setsockopt函式

DHCP的工作流程

1.dhcp 協議簡介 dhcp 全稱是 dynamic host configuration protocol 中文名為動態主機配置協議,它的前身是 bootp 它工作在 osi的應用層,是一種幫助計算機從指定的 dhcp 伺服器獲取它們的配置資訊的自舉協議。dhcp 使用客戶端 伺服器模式,請求...

Struts的工作流程

當actionservlet接受到乙個客戶請求時,將執行如下流程。流程 2 如果actionform例項不存在,就建立乙個actionform物件,把客戶提交的表單資料儲存到actionform物件中。3 根據配置資訊決定是否需要表單驗證。如果需要驗證,就呼叫actionform的validate ...

struts的工作流程!

已經開始接觸到框架了,今天是學習struts的第一天,感覺有點小暈!和周圍同學了解到以後工作可能會用的很少,哎!既然學了就好好搞懂吧!struts是一種組建,是實現web中一些 和結構的軟體。現在學的是struts1.2版本,struts是基於mvc的,有乙個actionservlet,客戶端的所以...