8.11 UDP的connect函數
除非套接字已連接,否則異步錯誤是不會反悔到UDP套接字的。
我們確實能夠給UDP套接字調用connect,然而這樣做的結果卻與TCP連接不同的是沒有三路握手過程。內核僅僅是檢查是否存在馬上可知的錯誤。記錄對端的IP地址和port號,然后馬上返回調用進程。
對於已連接UDP套接字,與默認的未連接UDP套接字相比,發生了三個變化。
事實上一旦UDP套接字調用了connect系統調用,那么這個UDP上的連接就變成一對一的連接,可是通過這個UDP連接數據傳輸的性質還是不變的,仍然是不可靠的UDP連接。一旦變成一對一的連接。在調用系統調用發送和接受數據時也就能夠使用TCP那一套系統調用了。
事實上一旦UDP套接字調用了connect系統調用,那么這個UDP上的連接就變成一對一的連接,可是通過這個UDP連接數據傳輸的性質還是不變的,仍然是不可靠的UDP連接。一旦變成一對一的連接。在調用系統調用發送和接受數據時也就能夠使用TCP那一套系統調用了。
(1)我們再也不能給輸出操作指定目的IP地址和port號。也就是說,我們不使用sendto,而改用write或send。
寫到已連接UDP套接字上的不論什么內容都自己主動發送到由connect指定的協議地址。能夠給已連接的UDP套接字調用sendto。可是不能指定目的地址。sendto的第五個參數必須為空指針。第六個參數應該為0.
(2)不必使用recvfrom以獲悉數據報的發送者,而改用read、recv或recvmsg。在一個已連接UDP套接字上,由內核為輸入操作返回的數據報僅僅有那些來自connect指定協議地址的數據報。這樣就限制一個已連接UDP套接字能且僅能與一個對端交換數據報。
(3)由已連接UDP套接字引發的異步錯誤會返回給它們所在的進程,而未連接的UDP套接字不接收不論什么異步錯誤。
來自不論什么其它IP地址或斷開的數據報不投遞給這個已連接套接字。由於它們要么源IP地址要么源UDPport不與該套接字connect到的協議地址相匹配。
UDP客戶進程或server進程僅僅在使用自己的UDP套接字與確定的唯一對端進行通信時,才干夠調用connect。調用connect的一般是UDP客戶,只是有些網絡應用中的UDPserver會與單個客戶長時間通信TFTP,這樣的情況下。客戶和server都可能調用connect。
DNS提供了一個樣例 DNSserver進程一般是處理客戶請求的。因此server進程不能調用connect。
8.11.1給一個UDP套接字多次調用connect
擁有一個已連接UDP套接字的進程可出於下列兩個目的之中的一個再次調用connect:指定新的IP地址和port號。
port套接字。
為了斷開一個已UDP套接字連接,再次調用connect時把套接字地址結構的地址族設置為AF_UNSPEC。
當應用進程知道自己要給同一目的地址發送多個數據報時。顯式連接套接字效率更高。調用connect后調用兩次write涉及內核運行
1連接套接字
2輸出第一個數據報
3輸出第二個數據報
8.13UDP缺乏流量控制
UDP套接字接收緩沖區
由UDP給某個特定套接字排隊的UDP數據報數目受限於該套接字接收緩沖區的大小。能夠使用SO_RCVBUF套接字選項改動該值。
