UDP中使用bind和connect的作用

小 樓 一 夜 聽 春 雨發表於2018-01-24

1:UDP中可以使用connect系統呼叫


2:UDP中connect操作與TCP中connect操作有著本質區別。


TCP中呼叫connect會引起三次握手,client與server建立連結.UDP中呼叫connect核心僅僅把對端ip&port記錄下來.


3:UDP中可以多次呼叫connect,TCP只能呼叫一次connect.  


UDP多次呼叫connect有兩種用途:1,指定一個新的ip&port連結. 2,斷開和之前的ip&port的連結.


指定新連結,直接設定connect第二個引數即可.


斷開連結,需要將connect第二個引數中的sin_family設定成 AF_UNSPEC即可. 


4:UDP中使用connect可以提高效率.原因如下:


普通的UDP傳送兩個報文核心做了如下:#1:建立連結#2:傳送報文#3:斷開連結#4:建立連結#5:傳送報文#6:斷開連結


採用connect方式的UDP傳送兩個報文核心如下處理:#1:建立連結#2:傳送報文#3:傳送報文另外一點,  每次傳送報文核心都由可能要做路由查詢.


5:採用connect的UDP傳送接受報文可以呼叫send,write和recv,read操作.當然也可以呼叫sendto,recvfrom.


呼叫sendto的時候第五個引數必須是NULL,第六個引數是0.呼叫recvfrom,recv,read系統呼叫只能獲取到先前connect的ip&port傳送的報文. 




UDP中使用connect的好處:1:會提升效率.前面已經描述了.2:高併發服務中會增加系統穩定性.原因:假設client A 通過非connect的UDP與server B,C通訊.B,C提供相同服務.為了負載均衡,我們讓A與B,C交替通訊.A 與 B通訊IPa:PORTa <----> IPb:PORTb;


A 與 C通訊IPa:PORTa' <---->IPc:PORTc 


假設PORTa 與 PORTa'相同了(在大併發情況下會發生這種情況),那麼就有可能出現A等待B的報文,卻收到了C的報文.導致收報錯誤.解決方法內就是採用connect的UDP通訊方式.在A中建立兩個udp,然後分別connect到B,C.

 

 

對一個UDP的套介面多次呼叫connect的情況如何?

  • 連線新的IP和埠
  • 斷開前面的連線

第一個目的不同於TCP連線connect的使用:對於TCP連線,connect只能呼叫一次;針對UDP則可以connect到不同的server,eg:client需要和多個伺服器同時通訊。

第二個目的為了斷開一個已連線的UDP連線,再次呼叫connect時,把套接字地址結構的地址簇成員(IPv4為sin_family,IPv6為sin6_family),設定為AF_UNSPEC即可。

 

效能:當程式知道自己要給同一個目的地址傳送多個資料包時,顯式連線套接字效率更高。

而臨時連線未連線的UDP套接字大約會消耗每個UDP傳輸三分之一的開銷。

 

相關文章