轉自于: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狀态;

總結:
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(監聽套接字可讀)而喚起監聽程序)