每當(dāng)想寫(xiě)文章就想百度一下,百度之后發(fā)現(xiàn)socket比預(yù)想的要復(fù)雜尖淘。
socket定義:中文名套接字奕锌,網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱(chēng)為一個(gè)socket村生;簡(jiǎn)單滴說(shuō)socket就是兩個(gè)端點(diǎn)之間的通信惊暴。socket是編程接口(API),對(duì)TCP/IP的封裝趁桃,不是協(xié)議辽话。
連接過(guò)程可以分為三個(gè)步驟:服務(wù)器監(jiān)聽(tīng),客戶(hù)端請(qǐng)求卫病,連接確認(rèn)油啤;服務(wù)器監(jiān)聽(tīng)就是實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài);客戶(hù)端請(qǐng)求是指由客戶(hù)端的套接字提出連接請(qǐng)求蟀苛;連接確認(rèn):服務(wù)器端接收到客戶(hù)端套接字的連接請(qǐng)求益咬,它就響應(yīng)客戶(hù)端套接字的請(qǐng)求,建立一個(gè)新的線(xiàn)程屹逛,把服務(wù)器端描述發(fā)給客戶(hù)端础废,在客戶(hù)端確認(rèn)了此描述汛骂,連接就建立就確認(rèn)好了。socket的類(lèi)型:1评腺、流套接字(SOCK_STREAM):流套接字用于提供面向連接帘瞭、可靠的數(shù)據(jù)傳輸服務(wù),應(yīng)用與http蒿讥;2蝶念、數(shù)據(jù)報(bào)套接字(SOCK_DGRAM):數(shù)據(jù)報(bào)套接字提供了一種無(wú)連接的服務(wù),應(yīng)用于UDP;原始套接字(SOCK_RAW)提供給數(shù)據(jù)鏈路層使用芋绸,不保證數(shù)媒殉,應(yīng)用于UDP。據(jù)包的順序摔敛。
socket編程一般編程語(yǔ)言都可以如Java廷蓉、python,socket常用函數(shù):socket()函數(shù)马昙,包括domain:協(xié)議域桃犬,又稱(chēng)協(xié)議族(family)、type:指定Socket類(lèi)型行楞、protocol:指定協(xié)議三個(gè)參數(shù)攒暇;bind()函數(shù)包括addrlen:對(duì)應(yīng)的是地址的長(zhǎng)度、sockfd:socket描述字子房、addr:是一個(gè)結(jié)構(gòu)指針形用;listen()、connect()证杭、accept()田度、close()、read()躯砰、write()等函數(shù)每币。
三次揮手用到的soceket函數(shù)如下:Client發(fā)出請(qǐng)求是調(diào)用connect()函數(shù)發(fā)送給服務(wù)器端,當(dāng)服務(wù)器端收到請(qǐng)求后調(diào)用accept()函數(shù)返回給Client琢歇;Client確認(rèn)后在返回給服務(wù)器端兰怠,這樣鏈接就建立;四次揮手李茫;用戶(hù)端發(fā)出請(qǐng)求是調(diào)用close()函數(shù)給服務(wù)端揭保,服務(wù)端返回準(zhǔn)備關(guān)閉請(qǐng)求調(diào)用close();客戶(hù)端確認(rèn)關(guān)閉調(diào)用close()函數(shù)發(fā)送請(qǐng)求給服務(wù)器魄宏,服務(wù)器確認(rèn)關(guān)閉(這里調(diào)用的是不是close()函數(shù)秸侣?)。根據(jù)上述可以看出通信是一系列socket方法的調(diào)用。
對(duì)于socke的理解還處于朦朧狀態(tài)味榛,TCP的三次握手建立連接和四次握手釋放連接是socket在起作用椭坚,原來(lái)是通過(guò)socket函數(shù)實(shí)現(xiàn)的越是接觸底層感覺(jué)難度越大,這樣說(shuō)來(lái)只要是TCP/IP協(xié)議那么就有編程soeket搏色;tsocket編程只能是細(xì)嚼慢咽了善茎,感覺(jué)事情越來(lái)越復(fù)雜了...