SOCK_DGRAM(数据报套接字)与SOCK_STREAM(流套接口)的区别
一、SOCK_DGRAM (數據報套接字)特性:
1、分組在發送后,可能無序地到達接收端
2、分組可能丟失。如果發生丟失,不會采取任何補救的措施,而且接受端也不必知道有分租丟失。
3、數據報分組有尺寸大小的限制,如果超出限制,在某些路由器和節點上就無法傳送。
4、分組是在不建立連接的情況下被發送到遠程進程的。
二、SOCK_STREAM (流套接口)特性:
1、不保留任何消息的邊界:舉一個例子:本地主機通過兩次獨立的write(2)調用向遠程主機發送數據,第一次本地進程寫入25字節的數據,并通過套接口發送到遠程進程,第二次再寫入30字節的數據發往遠程進程,總共55字節的數據,而遠程進程從套接口接收數據時,將消息作為一個完整的單元來接收,或是通過若干次獨立的讀操作來將數據取走,即接受端并不知道這55字節的數據是分25字節和30字節兩次來發送的。
2、有序性:可以保證接受的數據字節與發送是順序完全一致(意味著通信之前必須建立一個連接)
3、無錯性:可以保證接受的數據在接收端被無錯的接受。如果有錯誤發生,在嘗試完所有的錯誤恢復措施后仍無法消除錯誤,流套接口就會報告錯誤。所進行的錯誤恢復措施嘗試是完全自動的,不需編程者的指導。
三、SOCK_DGRAM(數據報套接字)與SOCK_STREAM(流套接口)的區別:
如果你需要傳輸的數據是準確的,建議采用TCP,也就是 SOCK_STREAM。
? ? ? ?如果你傳輸的是視頻音頻等數據,丟幾個包也無所謂的,可以采用UDP,也就是 ?SOCK_DGRAM
函數原型。
int socket(int domain, int type, int protocol);
第一個參數指定應用程序使用的通信協議的協議族,對于TCP/IP協議族,該參數置AF_INET;
第二個參數指定要創建的套接字類型,流套接字類型為SOCK_STREAM、數據報套接字類型為SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不適用某種特定的協議去封裝它,而是由程序自行處理數據包以及協議首部);
兩個重要的類型是 SOCK_STREAM 和 SOCK_DGRAM。 SOCK_STREAM表明數據象字符流 一樣通過 socket 。而 SOCK_DGRAM 則表明數據將是數據報(datagrams)的形式。
下面表示通信協議族用TCP/IP協議族,以流套接字類型傳輸,使用TCP協議
SOCKET ?testSocket ?= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);?
下面表示通信協議族用TCP/IP協議族,以數據報套接字類型傳輸,使用UDP協議
SOCKET testSocket ?= ?socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
總結
以上是生活随笔為你收集整理的SOCK_DGRAM(数据报套接字)与SOCK_STREAM(流套接口)的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: knn算法实现电影分类
- 下一篇: 根据数据建立分析模型是什么意思