Python nginx java php linux 程序员 编程 Ubuntu 开源 云计算 Firefox centos wordpress apache Windows shell 微软 Android google mysql

无连接的socket通信实现

 無連接的socket通信相對於建立連接的流socket較為簡單,因為在數據傳輸過程中不能保證 能夠到達,常用在一些對數據要求不高的地方,如在線視頻等,無連接的套接字不需要建立連接,省去了維護連接的開銷。所以,同樣的環境下一般比流套接字傳輸數據速率快,在實際應用中,一些應用軟件會自己維護無連接的套接字數據傳輸狀態,無連接的套接字使用TCP/ip協議簇的UDP協議傳輸數據。

 無連接的套接字通信模型,和面向連接的流通信不同,服務端在綁定socket到指定IP和端口後,並沒有因為listen函數監聽連接。也沒有使用accpet函數對新的請求建立連接,因為沒有連接的概念。傳輸協議無法區分不同的連接,也就不需要對每個新的請求創建連接。在客戶端創建socket之後,可以直接向服務端發送數據或者讀取服務端的數據。無連接的套接字的通信服務端和客戶端的界限相對模糊一些。

 無連接的套接字通信,發送和接收數據的函數和面向流套接字通信不同。使用的recfrom函數和sendto函數。

 read函數是負責從fd中讀取內容.當讀成功時,read返回實際所讀的字節數,如果返回的值是0表示已經讀到文件的結束了,小於0表示出現了錯誤。如果錯誤為EINTR說明讀是由中斷引起的,如果是ECONNREST表示網絡連接出了問題。

 write函數將buf中的nbytes字節內容寫入文件描述符fd.成功時返回寫的字節 數。失敗時返回-1,並設置errno變量。在網絡程序中,當我們向套接字文件描述符寫時有倆種可能。1)write的返回值大於0,表示寫了部分或者是 全部的數據。2)返回的值小於0,此時出現了錯誤。我們要根據錯誤類型來處理。如果錯誤為EINTR表示在寫的時候出現了中斷錯誤。如果為EPIPE表示 網絡連接出現了問題

延伸阅读

评论