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