1. 程式人生 > >UDP中的Connect

UDP中的Connect

標準的udp客戶端開了套介面後,一般使用sendto和recvfrom函式來發資料,實際上,udp傳送資料有兩種方法供大家選用的:
方法一: 
socket----->sendto()或recvfrom() 
方法二: 
socket----->connect()----->send()或recv().(此時sendto,recvfrom仍可用)
從定義可以看出,sendto和recvfrom在收發時指定地址,而send和recv則沒有,那麼他們的地址是在那裡指定的呢,答案就在於connect函式。
在udp程式設計中,如果你只往一個地址傳送,那麼你可以使用send和recv,在使用它們之前用connect把它們的目的地址指定一下就可以了。connect函式在udp中就是這個作用,用它來檢測udp埠的是否開放的、沒有被使用的。
給UDP套介面呼叫connect,與TCP不同的是:沒有三路握手過程。核心只是檢查是否存在立即可知的錯誤(例如一個顯然不可達的目的地),記錄對端的IP地址和埠號(取自傳遞給connect的套介面地址結構),然後立即返回到呼叫程序
對於已連線UDP套接字,與預設的未連線套接字相比,發生了以下變化:
1. 我們不必使用recvfrom以獲悉資料報的傳送者,而改用read,recv或recvmsg,在一個已連線UDP套介面上由核心為輸入操作返回的資料 報僅僅是那些來自connect所指定協議地址的資料報。目的地為這個已連線UDP套介面的本地協議地址,發源地卻不是該套介面早先connect到的協 議地址的資料報,不會投遞到該套介面。這樣就限制了一個已連線UDP套介面而且僅能與一個對端交換資料報。
2.由已連線的UDP套介面引發的非同步錯誤返回給他們所在的程序。


UDP套接字多次呼叫connect可以為下列2個目的之一:
1.指定新的IP地址和埠號; 
2.斷開套介面 
EXAMPLE:
server繫結172.25.40.206和10086埠,監聽
Client呼叫Connect時,netstat結果:
udp        0      0 172.25.40.206:32862     172.25.40.206:10086     ESTABLISHED 
udp        0      0 172.25.40.206:10086     *:* 


Client沒有Connect時:
udp        0      0 *:32862                 *:*                                 
udp        0      0 172.25.40.206:10086     *:*