TCP的listen和accept函式

2021-08-14 02:32:27 字數 829 閱讀 6681

int listen(int sockfd, int backlog);

完成兩件事情:

1、將未連線的套介面轉換成被動套介面,指示核心應接收指向此套

接的連線請求。

導致套介面從closed狀態到listen狀態;

2、規定核心為此套介面排隊的最大連線數。

一般來講,此函式應該在呼叫了socket&bind之後,在呼叫accept之前進行呼叫。

3、對於給定的監聽套介面,核心必須為它維護兩個佇列:

·未完成連線的佇列:正在等待完成tcp三路握手的syn分節,這些套介面都處於

syn_rcvd狀態;

·已完成連線的佇列:已完成三路握手的套介面,處於establish狀態。

而backlog為兩個佇列長度總和,因此,對於backlog,網路程式設計師們常常在程

序中設定預設值,同時允許通過命令列的形式進行修改。

int accept(int sockfd, struct sockaddr * cliaddr, socklen_t *addrlen);
如果accept成功,返回乙個由核心分配的全新描述字(已連線套介面描述字),代表與客戶的tcp連線。而此前的描述字(由socket函式生成)稱為監聽套介面描述字。兩者的區別非常重要:乙個伺服器常常只生成乙個監聽套介面且一直存在,直到該伺服器關閉;然而核心為每個已連線的客戶建立乙個已連線套介面,當伺服器完成某服務時,即可關閉。

該函式最多返回三個值:返回乙個即可能是已連線套介面描述字,也可能錯誤指示的整數;乙個客戶程序的協議位址(由cliaddr所指)以及該位址的大小(由addrlen所指)。

關於tcp ip中的listen與accept

首先需要說明的一點是 accept 不是監聽,accept 是接受新連線。listen 是進入監聽狀態,表示願意接收連線請求。listen之後有連線請求就將其放到佇列中,accept 時把新連線請求從佇列中取出,建立新的socket。然後就是accept 與listen 是屬於tcp ip協議的,而...

TCP伺服器listen函式的包裹函式

include int listen int sockfd,int backlog 成功返回0,失敗返回 1當tcp伺服器呼叫listen函式時,它做兩件事 把伺服器套接字從closed狀態轉換到listen狀態。backlog引數規定了核心中未完成連線套接字的最大值即套接字排隊的最大連線數。歷史上...

Swoole的push和listen用法

tcp連線迭代器,可以使用foreach遍歷伺服器當前所有的連線,此屬性的功能與swoole server connnection list是一致的,但是更加友好。遍歷的元素為單個連線的fd。注意 connections屬性是乙個迭代器物件,不是php陣列,所以不能用var dump或者陣列下標來訪...