天天看點

unix網絡程式設計之listen()詳解

轉自于:http://blog.csdn.net/ordeder/article/details/21551567

Unix網絡程式設計描述如下:

  #include <sys/socket.h>

  int listen(int sockfd,  int backlog);

    傳回:若成功則為0,  若出錯則為-1;

  本函數通常應該在調用socket和bind這兩個函數之後,并在調用accept函數之前調用;

為了了解其中的backlog參數,我們必須認識到核心為任何一個給定的監聽套接字維護兩個隊列:

  (1)未完成連接配接隊列(incomplete connection queue),每個這樣的SYN分節對應其中一項:已由某個客戶發出并到達伺服器,而伺服器正在等待完成相應的TCP三向交握過程,這些套接字處于SYN_RCVD狀态;

  (2)已完成連接配接隊列(completed connection queue),每個已完成TCP三向交握過程的用戶端對應其中一項。這些套接字處于ESTABLISHED狀态;

      

unix網絡程式設計之listen()詳解

總結:

  1、accept()函數不參與三次握手,而隻負責從建立連接配接隊列中取出一個連接配接和socketfd進行綁定;

  2、backlog參數決定了未完成隊列和已完成隊列中連接配接數目之和的最大值(從核心的角度,是否這個和就是等于sock->recv_queue ?);

  3、accept()函數調用,會從已連接配接隊列中取出一個“連接配接”(可以說描述的資料結構listensocket->sock->recv_queue[sk_buff] ? ),未完成隊列和已完成隊列中連接配接數    目之和将減少1;即accept将監聽套接字對應的sock的接收隊列中的已建立連接配接的sk_buff取下(從該sk_buff中可以獲得對端主機的發送過來的tcp/ip資料包)

  4、 監聽套接字的已完成隊列中的元素個數大于0,那麼該套接字是可讀的。

  5、 當程式調用accept的時候(設定阻塞參數),那麼判定該套接字是否可讀,不可讀則進入睡眠,直至已完成隊列中的元素個數大于0(監聽套接字可讀)而喚起監聽程序)

繼續閱讀