- Posted by 微博@Yangsc_o
- 原創(chuàng)文章,版權(quán)聲明:自由轉(zhuǎn)載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
簡(jiǎn)介
該篇文章主要回顧--TCP/IP協(xié)議族中的TCP/UDP、HTTP;還有Socket。(--該文很干,醞釀了許久!你能耐心看完嗎?O_o)
我在這個(gè)文章中,列舉了常見(jiàn)的TCP/IP族中的協(xié)議,今天主角是--傳輸層協(xié)議。
傳輸層(Transport Layer)是OSI(七層模型)中最重要、最關(guān)鍵的一層,它負(fù)責(zé)總體的數(shù)據(jù)傳輸和數(shù)據(jù)控制的一層,傳輸層提供端到端(應(yīng)用會(huì)在網(wǎng)卡注冊(cè)一個(gè)端口號(hào))的交換數(shù)據(jù)的機(jī)制,檢查分組編號(hào)與次序。傳輸層對(duì)其上三層如會(huì)話層等,提供可靠的傳輸服務(wù),對(duì)網(wǎng)絡(luò)層提供可靠的目的地站點(diǎn)信息。
傳輸層中的協(xié)議
- 傳輸層它為應(yīng)用層提供會(huì)話和數(shù)據(jù)報(bào)通信服務(wù)。
- 傳輸層承擔(dān)OSI傳輸層的職責(zé)。
- 傳輸層的核心協(xié)議是TCP和UDP。
TCP提供一對(duì)一的、面向連接的可靠通信服務(wù)。TCP建立連接,對(duì)發(fā)送的數(shù)據(jù)包進(jìn)行排序和確認(rèn),并恢復(fù)在傳輸過(guò)程中丟失的數(shù)據(jù)包。與TCP不同,UDP提供一對(duì)一或一對(duì)多的、無(wú)連接的不可靠通信服務(wù)。
不論是TCP/IP還是在OSI參考模型中,任意相鄰兩層的下層為服務(wù)提供者,上層為服務(wù)調(diào)用者。下層為上層提供的服務(wù)可分為兩類(lèi):面向連接服務(wù)和無(wú)連接服務(wù)。
- 面向連接的網(wǎng)絡(luò)服務(wù)
面向連接的網(wǎng)絡(luò)服務(wù)又稱(chēng)為虛電路(Virtual Circuit)服務(wù),它具有網(wǎng)絡(luò)連接建立、數(shù)據(jù)傳輸和網(wǎng)絡(luò)連接釋放三個(gè)階段。是按順序傳輸可靠的報(bào)文分組方式,適用于指定對(duì)象、長(zhǎng)報(bào)文、會(huì)話型傳輸要求。
面向連接服務(wù)以電話系統(tǒng)為模式。要和某個(gè)人通話,首先拿起電話,撥號(hào)碼,通話,然后掛斷。同樣在使用面向連接的服務(wù)時(shí),用戶(hù)首先要建立連接,使用連接,然后釋放連接。連接本質(zhì)上像個(gè)管道:發(fā)送者在管道的一端放入物體,接收者在另一端按同樣的次序取出物體;其特點(diǎn)是收發(fā)的數(shù)據(jù)不僅順序一致,而且內(nèi)容也相同。--類(lèi)似打電話
- 無(wú)連接的網(wǎng)絡(luò)服務(wù)
無(wú)連接網(wǎng)絡(luò)服務(wù)的兩實(shí)體之間的通信不需要事先建立好一個(gè)連接。無(wú)連接網(wǎng)絡(luò)服務(wù)有3種類(lèi)型:數(shù)據(jù)報(bào)(Datagram)、確認(rèn)交付(Confirmed Delivery)與請(qǐng)求回答(Request reply)。
無(wú)連接服務(wù)以郵政系統(tǒng)為模式。每個(gè)報(bào)文(信件)帶有完整的目的地址,并且每一個(gè)報(bào)文都獨(dú)立于其他報(bào)文,由系統(tǒng)選定的路線傳遞。在正常情況下,當(dāng)兩個(gè)報(bào)文發(fā)往同一目的地時(shí),先發(fā)的先到。但是,也有可能先發(fā)的報(bào)文在途中延誤了,后發(fā)的報(bào)文反而先收到;而這種情況在面向連接的服務(wù)中是絕對(duì)不可能發(fā)生的。--類(lèi)似發(fā)短信
傳輸控制協(xié)議(TCP)
- TCP全稱(chēng)是Transmission Control Protocol,中文名為傳輸控制協(xié)議,它可以提供可靠的、面向連接的網(wǎng)絡(luò)數(shù)據(jù)傳遞服務(wù)。傳輸控制協(xié)議主要包含下列任務(wù)和功能:
- 確保IP數(shù)據(jù)報(bào)的成功傳遞。
- 對(duì)程序發(fā)送的大塊數(shù)據(jù)進(jìn)行分段和重組。
- 確保正確排序及按順序傳遞分段的數(shù)據(jù)。
- 通過(guò)計(jì)算校驗(yàn)和,進(jìn)行傳輸數(shù)據(jù)的完整性檢查。
- 根據(jù)數(shù)據(jù)是否接收成功發(fā)送肯定消息。通過(guò)使用選擇性確認(rèn),也對(duì)沒(méi)有收到的數(shù)據(jù)發(fā)送否定確認(rèn)。
為必須使用可靠的、基于會(huì)話的數(shù)據(jù)傳輸程序,如客戶(hù)端/服務(wù)器數(shù)據(jù)庫(kù)和電子郵件程序,提供首選傳輸方法。
- TCP工作原理
TCP的連接建立過(guò)程又稱(chēng)為T(mén)CP三次握手;
- 首先發(fā)送方主機(jī)向接收方主機(jī)發(fā)起一個(gè)建立連接的同步(SYN)請(qǐng)求;
- 接收方主機(jī)在收到這個(gè)請(qǐng)求后向發(fā)送方主機(jī)回復(fù)一個(gè)同步/確認(rèn)(SYN/ACK)應(yīng)答;
- 發(fā)送方主機(jī)收到此包后再向接收方主機(jī)發(fā)送一個(gè)確認(rèn)(ACK),此時(shí)TCP連接成功建立.
一旦初始的三次握手完成,在發(fā)送和接收主機(jī)之間將按順序發(fā)送和確認(rèn)段。關(guān)閉連接之前,TCP使用類(lèi)似的握手過(guò)程驗(yàn)證兩個(gè)主機(jī)是否都完成發(fā)送和接收全部數(shù)據(jù)。
完成三次握手,客戶(hù)端與服務(wù)器開(kāi)始傳送數(shù)據(jù)。
三次握手示意圖:
TCP工作過(guò)程比較復(fù)雜,包括的內(nèi)容如下。
- TCP連接關(guān)閉:發(fā)送方主機(jī)和目的主機(jī)建立TCP連接并完成數(shù)據(jù)傳輸后,會(huì)發(fā)送一個(gè)將結(jié)束標(biāo)記置1的數(shù)據(jù)包,以關(guān)閉這個(gè)TCP連接,并同時(shí)釋放該連接占用的緩沖區(qū)空間。
- TCP重置:TCP允許在傳輸?shù)倪^(guò)程中突然中斷連接。
- TCP數(shù)據(jù)排序和確認(rèn)*:在傳輸?shù)倪^(guò)程中使用序列號(hào)和確認(rèn)號(hào)來(lái)跟蹤數(shù)據(jù)的接收情況。
- TCP重傳:在TCP的傳輸過(guò)程中,如果在重傳超時(shí)時(shí)間內(nèi)沒(méi)有收到接收方主機(jī)對(duì)某數(shù)據(jù)包的確認(rèn)回復(fù),發(fā)送方主機(jī)就認(rèn)為此數(shù)據(jù)包丟失,并再次發(fā)送這個(gè)數(shù)據(jù)包給接收方。
- TCP延遲確認(rèn):TCP并不總是在接收到數(shù)據(jù)后立即對(duì)其進(jìn)行確認(rèn),它允許主機(jī)在接收數(shù)據(jù)的同時(shí)發(fā)送自己的確認(rèn)信息給對(duì)方。
- TCP數(shù)據(jù)保護(hù)(校驗(yàn)):TCP是可靠傳輸?shù)膮f(xié)議,它提供校驗(yàn)和計(jì)算來(lái)實(shí)現(xiàn)數(shù)據(jù)在傳輸過(guò)程中的完整性。
用戶(hù)數(shù)據(jù)報(bào)協(xié)議(UDP)
UDP全稱(chēng)是User Datagram Protocol,中文名為用戶(hù)數(shù)據(jù)報(bào)協(xié)議。UDP 提供無(wú)連接的網(wǎng)絡(luò)服務(wù),該服務(wù)對(duì)消息中傳輸?shù)臄?shù)據(jù)提供不可靠的、最大努力傳送。這意味著它不保證數(shù)據(jù)報(bào)的到達(dá),也不保證所傳送數(shù)據(jù)包的順序是否正確。
我最初就有一個(gè)疑惑:“既然UDP是一種不可靠的網(wǎng)絡(luò)協(xié)議,那么還有什么使用價(jià)值或必要呢?”
在有些情況下UDP可能會(huì)變得非常有用。因?yàn)閁DP具有TCP所望塵莫及的速度優(yōu)勢(shì)。雖然TCP中植入了各種安全保障功能,但是在實(shí)際執(zhí)行的過(guò)程中會(huì)占用大量的系統(tǒng)開(kāi)銷(xiāo),無(wú)疑使速度受到嚴(yán)重的影響。反觀UDP由于排除了信息可靠傳遞機(jī)制,將安全和排序等功能移交給上層應(yīng)用來(lái)完成,極大地降低了執(zhí)行時(shí)間,使速度得到了保證。
TCP與端口號(hào)
TCP和UDP都是IP層面的傳輸協(xié)議,是IP與上層之間的處理接口。TCP和UDP端口號(hào)被設(shè)計(jì)來(lái)區(qū)分運(yùn)行在單個(gè)設(shè)備上的多重應(yīng)用程序的IP地址。由于同一臺(tái)計(jì)算機(jī)上可能會(huì)運(yùn)行多個(gè)網(wǎng)絡(luò)應(yīng)用程序,所以計(jì)算機(jī)需要確保目標(biāo)計(jì)算機(jī)上接收源主機(jī)數(shù)據(jù)包的軟件應(yīng)用程序的正確性,以及響應(yīng)能夠被發(fā)送到源主機(jī)的正確應(yīng)用程序上。該過(guò)程正是通過(guò)使用TCP或UDP端口號(hào)來(lái)實(shí)現(xiàn)的。
--即每一個(gè)應(yīng)用都會(huì)在網(wǎng)卡上注冊(cè)一個(gè)端口號(hào)用來(lái)區(qū)分同一臺(tái)設(shè)備上應(yīng)用的之間的通信
在TCP和UDP頭部分,有“源端口”和“目標(biāo)端口”段,主要用于顯示發(fā)送和接收過(guò)程中的身份識(shí)別信息。IP 地址和端口號(hào)合在一起被稱(chēng)為“套接字”。TCP端口比較復(fù)雜,其工作方式與UDP端口不同。UDP端口對(duì)于基于UDP的通信作為單一消息隊(duì)列和網(wǎng)絡(luò)端點(diǎn)來(lái)操作,而所有TCP通信的終點(diǎn)都是唯一的連接。每個(gè)TCP連接由兩個(gè)端點(diǎn)唯一識(shí)別。由于所有TCP連接由兩對(duì) IP 地址和TCP端口唯一識(shí)別(每個(gè)所連主機(jī)都有一個(gè)地址/端口對(duì)),因此每個(gè)TCP服務(wù)器端口都能提供對(duì)多個(gè)連接的共享訪問(wèn)
再看一下IP數(shù)據(jù)包和TCP/UDP的數(shù)據(jù)包
數(shù)據(jù)包.png
HTTP協(xié)議
超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。
http協(xié)議規(guī)定了客戶(hù)端和服務(wù)器之間的數(shù)據(jù)傳輸格式.
- http優(yōu)點(diǎn):
簡(jiǎn)單快速:
http協(xié)議簡(jiǎn)單,通信速度很快;
靈活:
http協(xié)議允許傳輸任意類(lèi)型的數(shù)據(jù);
短連接:
http協(xié)議限制每次連接只處理一個(gè)請(qǐng)求,服務(wù)器對(duì)客戶(hù)端的請(qǐng)求作出響應(yīng)后,馬上斷開(kāi)連接.這種方式可以節(jié)省傳輸時(shí)間.
http協(xié)議的使用
- 請(qǐng)求:客戶(hù)端向服務(wù)器索要數(shù)據(jù).
http協(xié)議規(guī)定:一個(gè)完整的http請(qǐng)求包含'請(qǐng)求行','請(qǐng)求頭','請(qǐng)求體'三個(gè)部分;
- 請(qǐng)求行:包含了請(qǐng)求方法,請(qǐng)求資源路徑,http協(xié)議版本. "GET /resources/images/ HTTP/1.1"
- 請(qǐng)求頭:包含了對(duì)客戶(hù)端的環(huán)境描述,客戶(hù)端請(qǐng)求的主機(jī)地址等信息.
Accept: text/html ( 客戶(hù)端所能接收的數(shù)據(jù)類(lèi)型 )
Accept-Language: zh-cn ( 客戶(hù)端的語(yǔ)言環(huán)境 )
Accept-Encoding: gzip( 客戶(hù)端支持的數(shù)據(jù)壓縮格式 )
Host: m.baidu.com( 客戶(hù)端想訪問(wèn)的服務(wù)器主機(jī)地址 )
User-Agent: Mozilla/5.0(Macintosh;Intel Mac OS X10.10 rv:37.0) Gecko/20100101Firefox/37.0( 客戶(hù)端的類(lèi)型,客戶(hù)端的軟件環(huán)境 )
- 請(qǐng)求體:客戶(hù)端發(fā)給服務(wù)器的具體數(shù)據(jù),比如文件/圖片等.
- 響應(yīng):服務(wù)器返回客戶(hù)端想要的數(shù)據(jù)
http協(xié)議規(guī)定:一個(gè)完整的http響應(yīng)包含'狀態(tài)行','響應(yīng)頭','實(shí)體內(nèi)容'三個(gè)部分;
- 狀態(tài)行:包含了http協(xié)議版本,狀態(tài)嗎,狀態(tài)英文名稱(chēng).
"HTTP/1.1 200 OK" - 響應(yīng)頭:包含了對(duì)服務(wù)器的描述,對(duì)返回?cái)?shù)據(jù)的描述.
Content-Encoding: gzip(服務(wù)器支持的數(shù)據(jù)壓縮格式) Content-Length: 1528(返回?cái)?shù)據(jù)的長(zhǎng)度)
Content-Type:application/xhtml+xml;charset=utf-8(返回?cái)?shù)據(jù)的類(lèi)型)
Date: Mon,15Jun201509:06:46GMT(響應(yīng)的時(shí)間) Server: apache (服務(wù)器類(lèi)型)
- 實(shí)體內(nèi)容:服務(wù)器返回給客戶(hù)端的具體數(shù)據(jù)(圖片/html/文件...).
- 發(fā)送http請(qǐng)求
在iOS開(kāi)發(fā)中,發(fā)送http請(qǐng)求的方案有很多,常見(jiàn)的有如下幾種:
- 蘋(píng)果原生:
NSURLConnection:
用法簡(jiǎn)單,古老經(jīng)典的一種方案.
NSURLSession:
iOS7以后推出的技術(shù),功能NSURLConnection更加強(qiáng)大.
CFNetWork:NSURL的底層,純C語(yǔ)言,一般不用.
- 第三方框架:
AFNetWorking(OC);Alamofire(swift);
http方法
http協(xié)議定義了很多方法對(duì)應(yīng)不同的資源操作,其中最常用的是GET和POST方法。
eg:GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
增:PUT
刪:DELETE
改:POST
查:GET
因?yàn)镚ET和POST可以實(shí)現(xiàn)上述所有操作,所以,在現(xiàn)實(shí)開(kāi)發(fā)中,GET和POST方法使用的最為廣泛,除此以外HEAD請(qǐng)求使用頻率也比較高;
- GET
在請(qǐng)求URL后面以?的形式跟上發(fā)給服務(wù)器的參數(shù),參數(shù)以"參數(shù)名"="參數(shù)值"的形式拼接,多個(gè)參數(shù)之間用&分隔;
GET的本質(zhì)是從服務(wù)器得到數(shù)據(jù),效率更高.并且GET請(qǐng)求可以被緩存.
注意:GET的長(zhǎng)度是有限制的,不同的瀏覽器有不同的長(zhǎng)度限制,一般在2~8K之間;
- POST
POST的本質(zhì)是向服務(wù)器發(fā)送數(shù)據(jù),也可以獲得服務(wù)器處理之后的結(jié)果,效率不如GET.POST請(qǐng)求不可以被緩存,每次刷新之后都需要重新提交表單.
發(fā)送給服務(wù)器的參數(shù)全部放在'請(qǐng)求體'中;
理論上,POST傳遞的數(shù)據(jù)量沒(méi)有限制.
注意:所有涉及到用戶(hù)隱私的數(shù)據(jù)(密碼/銀行卡號(hào)等...)都要用POST的方式傳遞.
- HEAD
HEAD方法通常用在下載文件之前,獲取遠(yuǎn)程服務(wù)器的文件信息!相比于GET請(qǐng)求,不會(huì)下載文件數(shù)據(jù),只獲得響應(yīng)頭信息!
一般,使用HEAD方法的目的是提前告訴用戶(hù)下載文件的信息,由用戶(hù)確定是否下載文件!所以, HEAD方法,最好發(fā)送同步請(qǐng)求!
響應(yīng)消息
1xx:信息響應(yīng)類(lèi),表示接收到請(qǐng)求并且繼續(xù)處理
2xx:處理成功響應(yīng)類(lèi),表示動(dòng)作被成功接收、理解和接受
3xx:重定向響應(yīng)類(lèi),為了完成指定的動(dòng)作,必須接受進(jìn)一步處理
4xx:客戶(hù)端錯(cuò)誤,客戶(hù)請(qǐng)求包含語(yǔ)法錯(cuò)誤或者是不能正確執(zhí)行
5xx:服務(wù)端錯(cuò)誤,服務(wù)器不能正確執(zhí)行一個(gè)正確的請(qǐng)求;
詳細(xì)描述:狀態(tài)碼
Socket
Socket 簡(jiǎn)介
- Socket起源于 20 世 紀(jì) 80 年代早期,最早由 4.1c BSD UNIX 引入,所以也稱(chēng)之為“BSD Socket 或者 Berkeley Socket”。BSD Socket 是事實(shí)上的網(wǎng)絡(luò)應(yīng)用編程接口標(biāo)準(zhǔn),其它編程語(yǔ)言往往也是用與這套(用C寫(xiě)成的編程接口)類(lèi)似接口。
- 用 Socket 能夠?qū)崿F(xiàn)網(wǎng)絡(luò)上的不同主機(jī)之間或同一主機(jī)的不同對(duì)象之間的數(shù)據(jù)通信。所以,現(xiàn)在 Socket 已經(jīng)是一類(lèi)通用通信接口的集合。
大的類(lèi)型可以分為網(wǎng)絡(luò) Socket 和本地 Socket 兩種。
本地上的兩個(gè)進(jìn)程如何通信?
- 內(nèi)存共享(
munmap()
);
- 消息和隊(duì)列;
- 管道(匿名管道
pipe()
和命名管道mkfifo()
); - 信號(hào)量(
P V
操作); - RPC remote protocol control
- 本地Socket;
網(wǎng)路上的兩個(gè)進(jìn)程如何通信?
本地進(jìn)程間通信(IPC)通過(guò)PID(在終端中輸入ps -ef可查看PID)可以唯一確定彼此,然后通過(guò)共享內(nèi)存,消息隊(duì)列來(lái)通;網(wǎng)絡(luò)上的兩個(gè)進(jìn)程確定彼此需要IP與端口號(hào),通過(guò)傳輸層(TCP/UDP)協(xié)議進(jìn)行通信;
這就是網(wǎng)絡(luò) Socket 。
socket可以理解為:在TCP/UDP 加一個(gè)端口(在網(wǎng)卡注冊(cè)的,還記得吧)綁定。
網(wǎng)路socket和 本地 Socket對(duì)比
- 在同一個(gè)設(shè)備上,兩個(gè)進(jìn)程如果需要進(jìn)行通訊最基本的一個(gè)前提能能夠唯一的標(biāo)示一個(gè)進(jìn)程,在本地進(jìn)程通訊中可以使用PID來(lái)唯一標(biāo)示一個(gè)進(jìn)程;
- PID只在本地唯一,網(wǎng)絡(luò)中的兩個(gè)進(jìn)程PID沖突幾率很大,此時(shí)顯然不行了,怎么辦?
IP層的ip地址可以唯一標(biāo)示主機(jī),而TCP層協(xié)議和端口號(hào)可以唯一標(biāo)示主機(jī)的一個(gè)進(jìn)程,所以可以利用ip地址+協(xié)議+端口號(hào)唯一標(biāo)示網(wǎng)絡(luò)中的一個(gè)進(jìn)程。
Socket通信就是一種確定了端口號(hào)的TCP/IP通信,或者說(shuō)Socket通信與IP通信差別就是端口確定,協(xié)議確定。
用一張圖表達(dá)一下:
端口的打開(kāi)是雙方的,在C/S(Client&&Server)結(jié)構(gòu)的TCP連接中不僅僅要注意到S的端口(監(jiān)聽(tīng)的),實(shí)際上C也開(kāi)了一個(gè)端口,而C端的端口是動(dòng)態(tài)端口,TCP連接建立的時(shí)候,C端的端口會(huì)在三次握手結(jié)束后確定,動(dòng)態(tài)打開(kāi)一個(gè),這個(gè)端口不受用戶(hù)/程序員的控制。
Socket C 端書(shū)寫(xiě)步驟
- 創(chuàng)建客戶(hù)端Socket
- 創(chuàng)建服務(wù)器Socket
- 連接到服務(wù)器(Socket編程)
- 發(fā)送數(shù)據(jù)給服務(wù)器
- 接收服務(wù)器返回的數(shù)據(jù)
- 關(guān)閉Socket : close(socketNumber)
一張經(jīng)典的Socket C/S的步驟圖。
1. 導(dǎo)入頭文件
#import <sys/socket.h> //socket相關(guān)
#import <netinet/in.h> //internet相關(guān)
#import <arpa/inet.h> //地址解析協(xié)議相關(guān)
2. socket(創(chuàng)建)
int socket(int, int, int);
/**
參數(shù)
第一個(gè)int:domain: 協(xié)議域,AF_INET(IPV4的網(wǎng)絡(luò)開(kāi)發(fā))
第二個(gè)int:type: Socket 類(lèi)型, SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,報(bào)文)
第三個(gè)int:protocol: IPPROTO_TCP,協(xié)議,如果輸入0,可以根據(jù)第二個(gè)參數(shù),自動(dòng)選擇協(xié)議
返回值
socket,如果 > 0 就表示成功
*/
3. connection (連接到“服務(wù)器)
connect(int, const struct sockaddr *, socklen_t)
/**
參數(shù)
1> 客戶(hù)端socket
2> 指向數(shù)據(jù)結(jié)構(gòu)sockaddr的指針,其中包括目的端口和IP地址
服務(wù)器的"結(jié)構(gòu)體"地址,C語(yǔ)言沒(méi)有對(duì)象
3> 結(jié)構(gòu)體數(shù)據(jù)長(zhǎng)度
返回值
0 成功/其他 錯(cuò)誤代號(hào)
*/
4. write(發(fā)送數(shù)據(jù))
send(int, const void *, size_t, int)
/**
參數(shù)
1> 客戶(hù)端socket
2> 發(fā)送內(nèi)容地址 void * == id
3> 發(fā)送內(nèi)容長(zhǎng)度
4> 發(fā)送方式標(biāo)志,一般為0
返回值
如果成功,則返回發(fā)送的字節(jié)數(shù),失敗則返回SOCKET_ERROR
*/
5. read (接收)
recv(int, void *, size_t, int)
/**
參數(shù)
第一個(gè)int :創(chuàng)建的socket
void *:接收內(nèi)容的地址
size_t:接收內(nèi)容的長(zhǎng)度
第二個(gè)int.:接收數(shù)據(jù)的標(biāo)記 0,就是阻塞式,一直等待服務(wù)器的數(shù)據(jù)
返回值
接收到的數(shù)據(jù)長(zhǎng)度
*/
6. close
close(int);
int:就是創(chuàng)建的socket
按照上面5個(gè)步驟就可以寫(xiě)一個(gè)socket的通信的小demo:
寫(xiě)好的已經(jīng)放在了我的github;
此時(shí)沒(méi)有寫(xiě)服務(wù)端,怎么測(cè)試?
可利用:nc -lk 端口號(hào):始終監(jiān)聽(tīng)本地計(jì)算機(jī)此端口的數(shù)據(jù)。
eg:nc -lk 6666;
操作步驟gif
1、監(jiān)聽(tīng) 6666端口
2、connettion;
3、發(fā)送socket
;服務(wù)器接收到socket
;
4、服務(wù)端send :hello socket;
S端socket通信步驟
- 提供一些服務(wù)
- 將這個(gè)服務(wù)與自己的IP地址、端口綁定
- 監(jiān)聽(tīng)任何到這個(gè)IP+端口的TCP請(qǐng)求
- 接受/拒絕建立這個(gè)TCP連接
- 讀寫(xiě)
- 斷開(kāi)TCP連接
socket服務(wù)端下次再談!
以上就是本次回顧。