Socket中listen/accept函數的區別

listen函數

摘要:listen函數使用主動連接套接口變爲被連接套接口,使得一個進程可以接受其它進程的請求,從而成爲一個服務器進程。在TCP服務器編程中listen函數把進程變爲一個服務器,並指定相應的套接字變爲被動連接。

listen函數在一般在調用bind之後-調用accept之前調用,它的函數原型是:

intlisten(int sockfd, int backlog)

參數sockfd

listen函數作用的套接字,sockfd之前由socket函數返回。在被socket函數返回的套接字fd之時,它是一個主動連接的套接字,也就是此時系統假設用戶會對這個套接字調用connect函數,期待它主動與其它進程連接,然後在服務器編程中,用戶希望這個套接字可以接受外來的連接請求,也就是被動等待用戶來連接。由於系統默認時認爲一個套接字是主動連接的,所以需要通過某種方式來告訴系統,用戶進程通過系統調用listen來完成這件事。

參數backlog

這個參數涉及到一些網絡的細節。進程處理一個一個連接請求的時候,可能還存在其它的連接請求。因爲TCP連接是一個過程,所以可能存在一種半連接的狀態,有時由於同時嘗試連接的用戶過多,使得服務器進程無法快速地完成連接請求。如果這個情況出現了,服務器進程希望內核如何處理呢?內核會在自己的進程空間裏維護一個隊列以跟蹤這些完成的連接但服務器進程還沒有接手處理或正在進行的連接,這樣的一個隊列內核不可能讓其任意大,所以必須有一個大小的上限。這個backlog告訴內核使用這個數值作爲上限。

毫無疑問,服務器進程不能隨便指定一個數值,內核有一個許可的範圍。這個範圍是實現相關的。很難有某種統一,一般這個值會小30以內。

accept函數

摘要:accept()用來接受參數ssocket連接,它的函數原型是:

intaccept(int s,struct sockaddr * addr,int * addrlen)

服務程序調用accept函數從處於監聽狀態的流套接字s的客戶連接請求隊列中取出排在最前的一個客戶請求,並且創建一個新的套接字來與客戶套接字創建連接通道,如果連接成功,就返回新創建的套接字的描述符,以後與客戶套接字交換數據的是新創建的套接字;如果失敗就返回 INVALID_SOCKET。該函數的第一個參數指定處於監聽狀態的流套接字;操作系統利用第二個參數來返回新創建的套接字的地址結構;操作系統利用第三個參數來返回新創建的套接字的地址結構的長度。


轉自:http://hi.baidu.com/duxingxia365/item/07d50d74ac23e25a0d0a07be

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章