基本通信模型
?
·概要:
??? 所謂的基本通信模型是指SOCKET通信。這里介紹的是初期學(xué)習(xí)使用的一些SOCKET相關(guān)概念和接口使用情況。
??? SOCKET編程也跟平臺(tái)有關(guān):linux等平臺(tái)使用的是標(biāo)準(zhǔn)SOCKET--又稱Berkeley Socket;windows平臺(tái)的Winsock。
?
·要點(diǎn):
--基礎(chǔ):
??? Socket實(shí)際上是網(wǎng)絡(luò)通信端點(diǎn)的一種抽象,它提供了一種發(fā)送和接收數(shù)據(jù)的機(jī)制。其中IP用于定位通信的計(jì)算機(jī),而端口則可以定位到通信的進(jìn)程。這跟電話很像:IP+Port相當(dāng)于電話號(hào)碼,只要知道電話號(hào)碼就可以給其他人打電話了。
??? 常用的TCP/UDP則是具體的通信方法(協(xié)議),這些是已經(jīng)成熟并被完整實(shí)現(xiàn)的技術(shù),所以使用的使用只要指定是采用TCP還是UDP方式就好。同時(shí)在這兩種協(xié)議上發(fā)展了很多應(yīng)用協(xié)議,TCP之上的FTP/SMTP/TTP/HTTP,UDP之上的TFTP和廣播技術(shù)。
??? 一個(gè)網(wǎng)絡(luò)連接需要的信息:本地主機(jī)地址+本地協(xié)議端口(怎么找到我)、遠(yuǎn)程主機(jī)地址+遠(yuǎn)程協(xié)議端口(怎么找到你)和協(xié)議(打電話還是發(fā)短信)。
?
--相關(guān)函數(shù)和數(shù)據(jù)結(jié)構(gòu)(以TCP為例):
數(shù)據(jù)結(jié)構(gòu):
??? socket作為整個(gè)通信的基礎(chǔ)在linux平臺(tái)定義為INT類型,而在windows平臺(tái)則定義為:SOCKET socket{int af(協(xié)議族),int type(類型),int protocol(協(xié)議地址)};同時(shí)在內(nèi)部定義了協(xié)議,可直接使用。
??? 通信中的IP和端口等信息被包含在一個(gè)表示地址的數(shù)據(jù)結(jié)構(gòu)中,windows平臺(tái)定義為struct sockaddr_in{sort sin_family;u_short sin_port,struct in_addr sin_addr;char sin_zero[8]};的數(shù)據(jù)結(jié)構(gòu)。
?
主函數(shù):
??? 向系統(tǒng)申請(qǐng)SOCKET資源的socket函數(shù)和相關(guān)的釋放socket資源函數(shù);
??? 作為客戶端的主動(dòng)連接函數(shù)connect函數(shù);
??? 服務(wù)器端配置函數(shù)bind(綁定IP和端口)和listen(設(shè)置緩存隊(duì)列長(zhǎng)度);
??? 服務(wù)器端主函數(shù)accept函數(shù)--用于接受客戶端連接請(qǐng)求;
??? 相關(guān)的讀寫函數(shù)send和recv兩個(gè)函數(shù)—linux還有write/read等。
IP地址轉(zhuǎn)換:
??? 整數(shù)地址與ASCII地址(如"192.168.16.182")之間的轉(zhuǎn)換函數(shù):
???????? int inet_aton(const char* straddr,struct in_addr* adrp);
???????? char* inet_ntoa(struct in_addr inaddr);
???????? in_addr_t inet_addr(const char* cp);
??? 域名和整數(shù)地址的轉(zhuǎn)換函數(shù):
???? struct hostent* gethostbyname(const char* name);
???? struct hostent* gethostbyaddr(const char* addr,int len,int family);
字節(jié)序列轉(zhuǎn)換:
??? 首先需要理解的是不同的存儲(chǔ)字節(jié)的格式:BigEndian(網(wǎng)絡(luò))和LittleEndian。
??? 相關(guān)轉(zhuǎn)換函數(shù):
??????? u_long htonl(u_long hostlong);
??????? u_short htons(u_short hostshort);
??????? u_long ntohl(u_long netlong);
??????? u_short ntohs(u_short netshort);
?
--常用通信模型:
??? 客戶端:
???? 初始化Socket--建立連接--收發(fā)數(shù)據(jù)--關(guān)閉連接;
??? 服務(wù)器端:
???? 初始化監(jiān)聽Socket(包含bind和listen)--接受新連接--收發(fā)數(shù)據(jù)--關(guān)閉連接;
??? 對(duì)于服務(wù)器端,在{接受新連接--收發(fā)數(shù)據(jù)}形成一個(gè)循環(huán)就可以作為簡(jiǎn)單的服務(wù)器模型了。同時(shí)也可以對(duì){接受新連接--收發(fā)數(shù)據(jù)}進(jìn)行擴(kuò)展就可擴(kuò)展出很多的通信模型來(lái)。
?
--UDP通信:
??? UDP相比于TCP使用的接口函數(shù)少,這跟UDP內(nèi)部的工作原理有關(guān)。
?
·小結(jié):
??? 很多的通信庫(kù)都會(huì)對(duì)相關(guān)的數(shù)據(jù)結(jié)構(gòu)概念和函數(shù)接口進(jìn)行封裝,來(lái)實(shí)現(xiàn)跨平臺(tái);
轉(zhuǎn)載于:https://www.cnblogs.com/davidyang2415/archive/2012/04/16/2451505.html
總結(jié)
- 上一篇: [Tool]靜態程式碼分析-FxCop
- 下一篇: Ext.form.TextArea文本区