大話socket是網絡編程

socket是網絡編程的基礎,本文用打電話來類比socket通信中建立TCP連接的過程。
    socket函數,表示你買了或者借了一部手機。
    bind函數,告訴別人你的手機號碼,讓他們給你打電話。
    listen函數,打開手機的鈴聲,而不是靜音,這樣有電話時可以立馬反應。listen函數的第二個參數,最大連接數,表示最多有幾個人可以同時撥打你的號碼。不過我們的手機,最多只能有一個人打進來,要不然就提示佔線。
    connect函數,你的朋友知道了你的號碼,通過這個號碼來聯繫你。在他等待你迴應的時候,不能做其他事情,所以connect函數是阻塞的。
    accept函數,你聽到了電話鈴聲,接電話,accept it!然後“喂”一聲,你的朋友聽到你的迴應,知道電話已經打進去了。至此,一個TCP連接建立了。
    read/write函數,連接建立後,TCP的兩端可以互相收發消息,這時候的連接是全雙工的。對應打電話中的電話煲。
    close函數,通話完畢,一方說“我掛了”,另一方迴應"你掛吧",然後將連接終止。實際的close(sockfd)有些不同,它不止是終止連接,還把手機也歸還,不在佔有這部手機,就當是公用電話吧。
    注意到,上述連接是阻塞的,你一次只能響應一個用戶的連接請求,但在實際網絡編程中,一個服務器服務於多個客戶,上述方案也就行不通了,怎麼辦?想一想1860,移動的聲訊服務檯,也是隻有一個號碼,它怎麼能同時服務那麼多人呢?可以這樣理解,在你打電話到1860時,總服務檯會讓一個接線員來爲你服務,而它自己卻繼續監聽有沒有新的電話接入。在網絡編程中,這個過程類似於fork一個子進程,建立實際的通信連接,而主進程繼續監聽。1860的接線員是有限的,所以當連接的人數達到上線時,它會放首歌給你聽,忙等待,直到有新的空閒接線員爲止。
    實際網絡編程中,處理併發的方式還有select/poll/epoll等。

下面是一個實際的socket通信過程:

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