UDP的系統(tǒng)緩存隊列與TCP的相比,有兩點顯著的不同:
1、UDP沒有SendQ。UDP的數(shù)據(jù)包不會被處理,通過調用sendto()(或者在connect()之后也可以調用send())將數(shù)據(jù)直接發(fā)送。
2、UDP的數(shù)據(jù)在緩存隊列中是有邊緣保證的,也就是說,數(shù)據(jù)包是有大小的。每次調用recvfrom()(或者在connect()之后調用recv())都會試圖接收一個完整的數(shù)據(jù)包——因此,UDP程序所指定的接收緩存大小應該足夠存放每一個UDP數(shù)據(jù)包,否則,多余的部分就會被拋棄,并且recvfrom()(或recv())返回一個異常(-1,并且拋出異常代碼)。

(在上圖中,我們用虛線的數(shù)據(jù)包邊緣表示TCP中的無邊緣保證;而UDP中字節(jié)之間用虛線隔開表示UDP的數(shù)據(jù)不會以字節(jié)為單位進行傳輸)
此外,UDP的RecvQ還可能存在于TCP的第三個不同:我們說,UCP是無連接的,當然,我們也可以調用connect()將UDP連接起來,但是在默認無連接的情況下,UDP的RecvQ中可以緩存來自所有遠程地址的數(shù)據(jù)包——這不僅僅在很多時候很不方便,如果我們只希望接收一個特定地址的數(shù)據(jù),比如作為客戶端只希望接收來自服務器的數(shù)據(jù);而且,因為這個緩存可以被任何信息進入,從而也是一個安全隱患,很可能這個緩存在短時間內就會被垃圾信息所填滿。
因此,很多時候我們也會用到“有連接”的UDP。
posted on 2010-06-11 11:18
lf426 閱讀(3038)
評論(0) 編輯 收藏 引用 所屬分類:
SDL入門教程 、
socket 編程入門教程