說白了谤牡,Socket就是服務器跟客戶端通訊用的副硅。
網(wǎng)絡間如何進行通信?
首先翅萤,在網(wǎng)絡中恐疲,如何判斷,“李白”是“李白”而不是“杜甫”呢套么?
在我們本機中培己,我們可以通過PID來標識一個唯一進程。
但是在網(wǎng)絡中呢胚泌?網(wǎng)絡并不能通過PID來判斷省咨。那網(wǎng)絡通過什么呢?通過網(wǎng)絡層的“IP”我們可以判斷一個唯一的主機玷室,然后通過傳輸層的“協(xié)議+端口號”我們可以判斷此主機中的一個應用程序(進程)零蓉。
就目前而言,幾乎所有的應用程序都是采用socket穷缤,而現(xiàn)在又是網(wǎng)絡時代敌蜂,網(wǎng)絡中進程通信是無處不在,這就是我為什么說“一切皆socket”津肛。
什么是Socket章喉?
socket起源于Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open –> 讀寫write/read-->關閉close”模式來操作秸脱。我的理解就是Socket就是該模式的一個實現(xiàn)落包,socket即是一種特殊的文件,一些socket函數(shù)就是對其進行的操作(讀/寫IO撞反、打開妥色、關閉)
Socket流程
第一階段,連接階段(三次握手)
connect在第二個握手階段返回遏片,accept在第三個階段返回
第二階段嘹害,讀寫階段
萬事具備只欠東風,至此服務器與客戶已經(jīng)建立好連接了吮便”恃剑可以調(diào)用網(wǎng)絡I/O進行讀寫操作了,即實現(xiàn)了網(wǎng)咯中不同進程之間的通信髓需!網(wǎng)絡I/O操作有下面幾組:
read()/write()
recv()/send()
readv()/writev()
recvmsg()/sendmsg()
recvfrom()/sendto()
我推薦使用recvmsg()/sendmsg()函數(shù)许师,這兩個函數(shù)是最通用的I/O函數(shù),實際上可以把上面的其它函數(shù)都替換成這兩個函數(shù)