從Linux原始碼看Socket(TCP)的accept
阿新 • • 發佈:2020-12-07
# 從Linux原始碼看Socket(TCP)的accept
## 前言
筆者一直覺得如果能知道從應用到框架再到作業系統的每一處程式碼,是一件Exciting的事情。 今天筆者就從Linux原始碼的角度看下Server端的Socket在進行Accept的時候到底做了哪些事情(基於Linux 3.10核心)。
# 一個最簡單的Server端例子
眾所周知,一個Server端Socket的建立,需要socket、bind、listen、accept四個步驟。
今天,筆者就聚焦於accept。
![](https://oscimg.oschina.net/oscnet/up-9307a14ef9ba7df3729136333a8d9439274.png)
程式碼如下:
```
void start_server(){
// server fd
int sockfd_server;
// accept fd
int sockfd;
int call_err;
struct sockaddr_in sock_addr;
......
call_err=bind(sockfd_server,(struct sockaddr*)(&sock_addr),sizeof(sock_addr));
......
call_err=listen(sockfd_server,MAX_BACK_LOG);
......
while(1){
struct sockaddr_in* s_addr_client = mem_alloc(sizeof(struct sockaddr_in));
int client_length = sizeof(*s_addr_client);
// 這邊就是我們今天的聚焦點accept
sockfd = accept(sockfd_server,(struct sockaddr_ *)(s_addr_client),(socklen_t *)&(client_length));
if(sockfd == -1){
printf("Accept error!\n");
continue;
}
process_connection(sockfd,(struct sockaddr_in*)(&s_addr_client));
}
}
```
首先我們通過socket系統呼叫建立了一個Socket,其中指定了SOCK_STREAM,而且最後一個引數為0,也就是建立了一個通常所有的TCP Socket。在這裡,我們直接給出TCP Socket所對應的ops也就是操作函式。
![codegen](https://oscimg.oschina.net/oscnet/up-ffb587cdd5c37946484f4b78df5053abdef.png)
## accept系統呼叫
好了,我們直接進入accept系統呼叫吧。
```
#include