æºç åæ listen
ç®å½
åè¨⌗
å æ ¸çæ¬linux-5.0.1. released on 2019å¹´3æ4æ¥
ä¸»è¦æºç ä½äºsocket.cä¸
//å建socket
int s = socket(AF_INET, SOCK_STREAM, 0);
//ç»å®
bind(s, ...)
//çå¬
listen(s, ...)
//æ¥å客æ·ç«¯è¿æ¥
int c = accept(s, ...)
//æ¥æ¶å®¢æ·ç«¯æ°æ®
recv(c, ...);
//å°æ°æ®æå°åºæ¥
printf(...)
é¦å
æ ¹æ®syscall_64.tblå¯ä»¥ç¥ébindãlistenãaccept齿¯ç³»ç»è°ç¨
41 common socket __x64_sys_socket
43 common accept __x64_sys_accept
...
49 common bind __x64_sys_bind
50 common listen __x64_sys_listen
socketå¹²äºå¥⌗
å建äºä¸ä¸ªæä»¶ï¼åå§åsocketç»æä½ï¼å¹¶ä¸å®ç°äºæä»¶åsocketçäºç¸ç»å®ãæç»è¿åæä»¶çæä»¶æè¿°ç¬¦.
struct socket {
socket_state state;
short type;
unsigned long flags;
struct socket_wq *wq;
struct file *file; //socketéè¦åä¸ä¸ªæä»¶ç»å®.
struct sock *sk; //socketsçç½ç»å±è¡¨ç¤º
const struct proto_ops *ops;
};
socket_stateçæä¸¾å«ä¹
â SS_FREE = 0, /* not allocated */
â SS_UNCONNECTED, /* unconnected to any socket */
â SS_CONNECTING, /* in process of connecting */
â SS_CONNECTED, /* connected to socket */
â SS_DISCONNECTING /* in process of disconnecting */
注æï¼è°ç¨socketçè¿åå¼çfdç±sock_map_fdè¿å.

bind å¹²äºå¥⌗
eee
listen å¹²äºå¥⌗
å¨listenä¸ç主è¦ä»»å¡:
- 设置socketç¶æä¸ºTCP_LISTEN
- å°socketé¾å ¥åè¿æ¥éåçHash表ä¸

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
struct request_sock *req,
bool fastopen, bool *req_stolen)
è¿ä¸ªççå䏿¬¡æ¡æç代ç .
accept å¹²äºå¥⌗
Read other posts