Qt使用UDp通信、套接字socket的成員函數bind()的作用


   一、 所謂bind,就是指綁定本地接受端口。
         指定ip,是為了分辨多ip主機。在有服務端和客戶端的UDP中,bind是服務端調用的函數,綁定的是服務端的IP,假設服務端有多個網卡,即會有多個IP,這個時候我們可以選擇用bind綁定其中一個IP,那么服務端只接收該IP上某端口的數據。如果bind綁定的是INADDR_ANY,即表示所有發送到服務器的這個端口,不管是哪個網卡/哪個IP地址接收到的數據,都由這個服務端進程進行處理。


      UDP組播時最好不要提客戶端/服務端的概念,而是提發送端/接收端的概念,避免出現邏輯理解混亂,其實這時,發送端==客戶端,接收端==服務端。使用udp組播時,發送端用writeDatagrams()函數就可以直接向組播地址IP和port端口發送數據,不用調用bind()綁定IP和port 。接受端則需要調用bind()綁定該組播IP和指定port端口,同時將模式設定為:shared,允許其他接受端綁定,以從該地址獲取數據。

以下是別人寫的

        1)采用UDP通信時(這里是有客戶端和服務器之分才這么說的,若是指定特定端口的UDP對等通信則不一樣了),客戶端也可以不需要bind()他自己的IP和端口號,而服務器需要bind自己IP地址和端口號。
           原因:因為服務器是時時在監聽有沒有客戶端的連接,如果服務器不綁定IP和端口的話,客戶端上線的時候怎么連到服務器呢,所以服務器要綁定IP和端口,而客戶端就不需要了,客戶端上線是主動向服務器發出請求的,因為服務器已經綁定了IP和端口,所以客戶端上線的就向這個IP和端口發出請求,這時因為客戶開始發數據了(發上線請求),系統就給客戶端分配一個隨機端口,這個端口和客戶端的IP會隨着上線請求一起發給服務器,服務收到上線請求后就可以從中獲起發此請求的客戶的IP和端口,接下來服務器就可以利用獲起的IP和端口給客戶端回應消息了。
             (詳解:UDP服務器是怎么知道客戶端的IP地址和UDP端口?一般來說有兩種方式: 一種是客戶端發消息顯式地告訴服務器IP地址和端口,消息內容就包括IP地址和UDP端口。另外一種就是隱式的,服務器從收到的包的頭部中得到包的源IP地址和端口。)

         2)若是沒有客戶端和服務器之分的程序,即自己指定特定端口的UDP對等通信,則客戶端和服務器都需要bind()IP地址和端口了。通常udp服務端根本不需要知道客戶端的socket,它直接建立一個socket用於發送即可,udp通信的關鍵只在於IP和端口。多個客戶端如果需要點到點分發,必須給服務端socket循環設置每個客戶端的IP並發出,但更常用的是廣播分發,服務端socket設定一個X.X.X.255的廣播地址並始終向它發送,每個客戶端建立的socket只需要綁定這個廣播地址便可以收到。(不是很理解)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM