socket通信概述_第1頁
socket通信概述_第2頁
socket通信概述_第3頁
socket通信概述_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精品文檔我們深諳信息交流的價值,那網絡中進程之間如何通信,如我們每天打開瀏覽器瀏覽網頁時,瀏覽器的進程怎么與web 服務器通信的?當你用QQ聊天時, QQ進程怎么與服務器或你好友所在的 QQ進程通信?這些都得靠socket ?那什么是 socket ? socket的類型有哪些?還有 socket 的基本函數,這些都是本文想介紹的。本文的主要內容如下:1、網絡中進程之間如何通信?2、 Socket 是什么?3、 socket的基本操作3.1、 socket()函數3.2、 bind() 函數3.3、 listen()、 connect() 函數3.4、 accept()函數3.5、 read(

2、) 、 write() 函數等3.6、 close()函數4、 socket中 TCP的三次握手建立連接詳解5、 socket中 TCP的四次握手釋放連接詳解6、一個例子(實踐一下)7、留下一個問題,歡迎大家回帖回答!1、網絡中進程之間如何通信?本地的進程間通信(IPC)有很多種方式,但可以總結為下面4 類:消息傳遞(管道、FIFO、消息隊列)同步(互斥量、條件變量、讀寫鎖、文件和寫記錄鎖、信號量)共享內存(匿名的和具名的)遠程過程調用(Solaris門和 Sun RPC)但這些都不是本文的主題!我們要討論的是網絡中進程之間如何通信?首要解決的問題是如何唯一標識一個進程,否則通信無從談起!在本

3、地可以通過進程PID 來唯一標識一個進程,但是在網絡中這是行不通的。其實 TCP/IP 協(xié)議族已經幫我們解決了這個問題,網絡層的 “ip 地址 ”傳輸層的 “協(xié)議 +端口 ”可以唯一標識網絡中的主機,而可以唯一標識主機中的應用程序(進程)。這樣利用三元組(ip 地址,協(xié)議,端口)就可以標識網絡的進程了,網絡中的進程通信就可以利用這個標志與其它進程進行交互。1歡迎下載精品文檔使用 TCP/IP 協(xié)議的應用程序通常采用應用編程接口:UNIX BSD的套接字( socket )和 UNIX System V 的 TLI(已經被淘汰),來實現(xiàn)網絡進程之間的通信。就目前而言,幾乎所有的應用程序都是采用s

4、ocket ,而現(xiàn)在又是網絡時代,網絡中進程通信是無處不在,這就是我為什么說 “一切皆 socket ”。2、什么是 Socket ?上面我們已經知道網絡中的進程是通過socket來通信的,那什么是socket呢? socket起源于 Unix ,而 Unix/Linux基本哲學之一就是“一切皆文件 ”,都可以用 “打開 open > 讀寫write/read> 關閉 close ”模式來操作。我的理解就是Socket 就是該模式的一個實現(xiàn),socket 即是一種特殊的文件, 一些 socket函數就是對其進行的操作(讀 / 寫 IO、打開、關閉),這些函數我們在后面進行介紹。so

5、cket 一詞的起源在組網領域的首次使用是在1970 年 2 月 12 日發(fā)布的文獻IETF RFC33 中發(fā)現(xiàn)的, 撰寫者為Stephen Carr 、Steve Crocker和 Vint Cerf。根據美國計算機歷史博物館的記載,Croker寫道: “命名空間的元素都可稱為套接字接口。一個套接字接口構成一個連接的一端,而一個連接可完全由一對套接字接口規(guī)定?!庇嬎銠C歷史博物館補充道:“這比 BSD的套接字接口定義早了大約12 年。”3、socket 的基本操作既然 socket是 “open write/readclose ”模式的一種實現(xiàn), 那么 socket就提供了這些操作對應的函數接

6、口。下面以TCP為例,介紹幾個基本的socket接口函數。3.1 、socket() 函數intsocket ( intdomain,inttype,intprotocol);。2歡迎下載精品文檔socket函數對應于普通文件的打開操作。普通文件的打開操作返回一個文件描述字,而socket() 用于創(chuàng)建一個socket描述符( socket descriptor),它唯一標識一個socket 。這個 socket 描述字跟文件描述字一樣,后續(xù)的操作都有用到它,把它作為參數,通過它來進行一些讀寫操作。正如可以給fopen 的傳入不同參數值,以打開不同的文件。創(chuàng)建socket 的時候,也可以指定不

7、同的參數創(chuàng)建不同的socket描述符, socket 函數的三個參數分別為:domain :即協(xié)議域, 又稱為協(xié)議族 ( family)。常用的協(xié)議族有, AF_INET、AF_INET6、AF_LOCAL(或稱 AF_UNIX, Unix 域 socket)、 AF_ROUTE等等。協(xié)議族決定了 socket 的地址類型,在通信中必須采用對應的地址,如AF_INET 決定了要用ipv4地址( 32 位的)與端口號( 16位的)的組合、 AF_UNIX決定了要用一個絕對路徑名作為地址。type :指定 socket 類型。常用的socket 類型有, SOCK_STREAM、SOCK_DGRA

8、M、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等( socket 的類型有哪些?) 。protocol :故名思意,就是指定協(xié)議。常用的協(xié)議有,IPPROTO_TCP、 IPPTOTO_UDP、IPPROTO_SCTP、 IPPROTO_TIPC等,它們分別對應 TCP傳輸協(xié)議、 UDP傳輸協(xié)議、 STCP傳輸協(xié)議、 TIPC 傳輸協(xié)議(這個協(xié)議我將會單獨開篇討論?。?。注意:并不是上面的 type 和 protocol 可以隨意組合的,如SOCK_STREAM不可以跟 IPPROTO_UDP組合。當protocol為 0 時,會自動選擇type 類型對應的默認協(xié)議

9、。當我們調用 socket 創(chuàng)建一個 socket 時,返回的 socket 描述字它存在于協(xié)議族( addressfamily,AF_XXX)空間中,但沒有一個具體的地址。如果想要給它賦值一個地址,就必須調用 bind() 函數,否則就當調用connect() 、 listen()時系統(tǒng)會自動隨機分配一個端口。3.2 、bind() 函數正如上面所說bind()函數把一個地址族中的特定地址賦給socket 。例如對應AF_INET、AF_INET6 就是把一個ipv4 或 ipv6 地址和端口號組合賦給socket 。intbind ( intsockfd,conststructsockad

10、dr *addr, socklen_t addrlen);函數的三個參數分別為:sockfd :即 socket描述字,它是通過socket()函數創(chuàng)建了,唯一標識一個socket 。bind()。3歡迎下載精品文檔函數就是將給這個描述字綁定一個名字。addr :一個 const struct sockaddr *指針,指向要綁定給sockfd的協(xié)議地址。這個地址結構根據地址創(chuàng)建socket時的地址協(xié)議族的不同而不同,如ipv4 對應的是:struct sockaddr_in sa_family_tsin_family; /* address family: AF_INET */in_port

11、_tsin_port;/* port in network byte order */struct in_addr sin_addr;/* internet address */;/* Internet address. */struct in_addr uint32_ts_addr;/* address in network byte order */;ipv6 對應的是:struct sockaddr_in6 sa_family_tsin6_family;/* AF_INET6 */in_port_tsin6_port;/* port number */uint32_tsin6_flowi

12、nfo; /* IPv6 flow information */struct in6_addr sin6_addr;/* IPv6 address */uint32_tsin6_scope_id; /* Scope ID (new in 2.4) */;struct in6_addr unsigned chars6_addr16;/* IPv6 address */;Unix 域對應的是:#define UNIX_PATH_MAX108struct sockaddr_un sa_family_t sun_family;/* AF_UNIX */charsun_pathUNIX_PATH_MAX

13、; /* pathname */;addrlen :對應的是地址的長度。通常服務器在啟動的時候都會綁定一個眾所周知的地址(如 ip 地址 +端口號) ,用于提供服務,客戶就可以通過它來接連服務器;而客戶端就不用指定,有系統(tǒng)自動分配一個端口號和自身的 ip 地址組合。這就是為什么通常服務器端在listen之前會調用bind () ,而客戶端就不會調用,而是在connect () 時由系統(tǒng)隨機生成一個。網絡字節(jié)序與主機字節(jié)序。4歡迎下載精品文檔主機字節(jié)序就是我們平常說的大端和小端模式:不同的CPU有不同的字節(jié)序類型,這些字節(jié)序是指整數在內存中保存的順序,這個叫做主機序。引用標準的Big-Endia

14、n和 Little-Endian的定義如下:a) Little-Endian就是低位字節(jié)排放在內存的低地址端,高位字節(jié)排放在內存的高地址端。b) Big-Endian就是高位字節(jié)排放在內存的低地址端,低位字節(jié)排放在內存的高地址端。網絡字節(jié)序:4 個字節(jié)的32 bit值以下面的次序傳輸:首先是 0 7bit ,其次 8 15bit ,然后 16 23bit,最后是 2431bit。這種傳輸次序稱作大端字節(jié)序。由于 TCP/IP 首部中所有的二進制整數在網絡中傳輸時都要求以這種次序,因此它又稱作網絡字節(jié)序。字節(jié)序,顧名思義字節(jié)的順序,就是大于一個字節(jié)類型的數據在內存中的存放順序,一個字節(jié)的數據沒有

15、順序的問題了。所以 :在將一個地址綁定到socket的時候, 請先將主機字節(jié)序轉換成為網絡字節(jié)序,而不要假定主機字節(jié)序跟網絡字節(jié)序一樣使用的是Big-Endian。由于這個問題曾引發(fā)過血案!公司項目代碼中由于存在這個問題,導致了很多莫名其妙的問題,所以請謹記對主機字節(jié)序不要做任何假定,務必將其轉化為網絡字節(jié)序再賦給socket 。3.3 、listen()、connect() 函數如果作為一個服務器,在調用socket() 、 bind() 之后就會調用listen()來監(jiān)聽這個socket ,如果客戶端這時調用connect() 發(fā)出連接請求,服務器端就會接收到這個請求。intlisten(

16、 intsockfd,intbacklog);intconnect ( intsockfd,conststructsockaddr *addr, socklen_t addrlen);。5歡迎下載精品文檔listen函數的第一個參數即為要監(jiān)聽的socket描述字,第二個參數為相應socket可以排隊的最大連接個數。socket()函數創(chuàng)建的socket默認是一個主動類型的,listen函數將 socket 變?yōu)楸粍宇愋偷?,等待客戶的連接請求。connect 函數的第一個參數即為客戶端的socket 描述字,第二參數為服務器的socket 地址,第三個參數為socket地址的長度??蛻舳送ㄟ^調用

17、connect函數來建立與TCP服務器的連接。3.4 、accept() 函數TCP服務器端依次調用socket() 、 bind() 、 listen()之后,就會監(jiān)聽指定的socket地址了。 TCP客戶端依次調用socket() 、connect() 之后就想 TCP服務器發(fā)送了一個連接請求。 TCP服務器監(jiān)聽到這個請求之后,就會調用accept()函數取接收請求,這樣連接就建立好了。之后就可以開始網絡I/O 操作了,即類同于普通文件的讀寫I/O 操作。intaccept ( intsockfd,structsockaddr *addr, socklen_t *addrlen);accept 函數的第一個參數為服務器的socket描述字,第二個參數為指向structsockaddr* 的指針,用于返回客戶端的協(xié)議地址,第三個參數為協(xié)議地址的長度。如果accpet成功,那么其返回值是由內核自動生

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論