天天看點

Socket網絡程式設計初探Socket網絡程式設計初探

MarkdownPad Document

即C/S架構,其實web服務在某種意義上也算是C/S架構

一個特點是伺服器端持續運作對外提供服務

為何學習socket一定要先學習網際網路協定:

C/S架構的軟體是基于網絡進行通信的

網絡的核心就是一堆協定,即标準,想要開發一款基于網絡通信的軟體就必須遵循這些标準

socket是處在應用層和傳輸層中間的一組接口

說到這,那麼socket到底是個什麼呢?Socket是應用層與TCP/IP協定族通信的中間軟體抽象層,它是一組接口。在設計模式中,socket其實就是一個門面模式,它把複雜的TCP/IP協定族隐藏在socket接口後面,對使用者來說,一組簡單的接口就是全部,讓socket去組織資料,以符合指定的協定。是以,無需深究TCP/UDP協定,socket已經為我們封裝好了

基于檔案類型的套接字家族:AFUNIX基于網絡類型的套接字家族:AFINET
先從伺服器端說起。伺服器端先初始化Socket,然後與端口綁定(bind),對端口進行監聽(listen),調用accept阻塞,等待用戶端連接配接。在這時如果有個用戶端初始化一個Socket,然後連接配接伺服器(connect),如果連接配接成功,這時用戶端與伺服器端的連接配接就建立了。用戶端發送資料請求,伺服器端接收請求并處理請求,然後把回應資料發送給用戶端,用戶端讀取資料,最後關閉連接配接,一次互動結束

服務端套接字函數

用戶端套接字函數

公共用途的套接字函數

面向鎖的套接字方法

面向檔案的套接字的函數

代碼示例:

服務端

用戶端

注意:這時候當用戶端輸入消息為空的話程式會卡住,那是因為無論是服務端還是用戶端都要到自己所在主機緩沖區去拿消息,因為這時發送為空,服務端根本就不會有任何反應,是以用戶端的緩沖區也不會有任何内容,是以這時它會一直徒勞的等待。。。 這時的解決辦法當然要在用戶端想辦法,很簡單,我們不讓用戶端發送空消息即可,在send()方法之前加判斷:
你肯定以為這個時候就完事了,這時請嘗試斷開用戶端連結試試。。。試想,既然作為服務端,顧名思義就是要持續不斷的為不同的用戶端持續的提供服務,怎麼能一個用戶端用完即結束呢?解決方案如下:

注意:可能會有人遇到重新開機服務端時Address already in use 的情況,這個是由于你的服務端仍然存在四次揮手的timewait狀态在占用位址(如果不懂,請深入研究1.tcp三次握手,四次揮手 2.syn洪水攻擊 3.伺服器高并發情況下會有大量的timewait狀态的優化方法)

解決方法:

繼續閱讀