TKeed原始碼分析之監聽之後資料的接收與連線的關閉

2021-09-26 18:54:59 字數 1670 閱讀 4749

遍歷events陣列,根據監聽種類及描述符型別分發操作

tk_handle_events(epoll_fd, listen_fd, events, events_num, conf.root, tp);

// 分發處理函式

void tk_handle_events(int epoll_fd, int listen_fd, struct epoll_event* events,

int events_num, char* path, tk_threadpool_t* tp)

else

// 將請求連線任務加入到執行緒池中

int rc = threadpool_add(tp, do_request, events[i].data.ptr);

// do_request(events[i].data.ptr);}}

}

是監聽事件,則為該事件建立連線套接字,將該套接字加入epoll監聽事件

是連線套接字中有事件發生,則對epoll_event結構體中的data聯合結構體中指標指向的資料進行處理,該指標指向乙個request結構體,將該處理任務加入到執行緒池中。

在監聽事件到來時,建立連線,開始接受對方資料,需要用到accept_connection(listen_fd, epoll_fd, path);函式。

void accept_connection(int listen_fd, int epoll_fd, char* path)
要能看到這個函式,必須搞懂下面幾個函式

接受連線的函式

//接受連線

int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

struct sockaddr_in client_addr;

memset(&client_addr,0,sizeof(struct sockaddr_in));

socklen_t client_addr_len=0;

if(accept(listen_fd,(struct sockaddr *)&client_addr,&client_addr_len)==-1)

return -1;

//client_addr用來儲存對端的port和ip位址,失敗返回-1,並設定errno,

// 成功返回乙個新的連線套接字,伺服器可以通過讀寫該socket來與對端進行通訊

關閉連線

int close(int fd);

//將fd上的讀和寫全部關閉

//該函式呼叫一次,fd的引用計數就-1,當減到0的時候,就真正關閉連線

//在多程序裡,一次fork()會使系統預設將父程序開啟的socket引用計數+1,因此必須在父程序和子程序中都呼叫close()才能將連線關閉

//如果無論如何都要立即終止連線,可以使用下面的函式

int shutdown(int sockfd,int howto);

//howto有三種行為:

關閉sockfd上讀的這一半,不能再從sockfd上讀資料

關閉sockfd上寫的這一半,不能再對sockfd進行寫操作

關閉讀和寫

//關閉成功返回0,失敗返回-1,並設定errno

TKeed原始碼分析之讀寫資料

socket通訊的讀寫 ssize t read int fd,void buf,size t count ssize t write int fd,const void buf,size t count tcp資料讀寫 include include ssize t recv int sockfd...

TKeed原始碼分析之新增listen監聽事件

前面初始化監聽套接字listen fd後,現在把它加入到epoll核心事件表當中。初始化套接字開始監聽 int listen fd socket bind listen conf.port 設定為socket非阻塞 int rc make socket non blocking listen fd ...

Spring原始碼分析之元件掃瞄事件監聽處理器

判斷是否支援jpa來註冊持久化bean處理器 check for jpa support,and if present add the persistenceannotationbeanpostprocessor.if jpapresent registry.containsbeandefiniti...