UDP SOCKET編程中的connect()

UDP是一個無連接的協議,因此socket函數connect()似乎對UDP是沒有意義的,然而事實不是這樣。

使用connect()來建立與服務程序的連接。與TCP協議不同,UDP的connect()並沒有與服務程序三次握手。上面說了UDP是非連接的,實際上也可以是連接的。使用連接的UDP,kernel可以直接返回錯誤信息給用戶程序,從而避免由於沒有接收到數據而導致調用recvfrom()一直等待下去,看上去好像客戶程序沒有反應一樣


    一個插口有幾個屬性,其中包括協議,本地地址/端口,目的地址/端口。

    對於UDP來說:

    socket()函數建立一個插口;

    bind()函數指明瞭本地地址/端口(包括ADDR_ANY, 通配所有本地網絡接口);

    connect()可以用來指明目的地址/端口

    一般來說,UDP客戶端在建立了插口後會直接用sendto()函數發送數據,需要在sendto()函數的參數裏指明目的地址/端口。如果一個UDP客戶端在建立了插口後首先用connect()函數指明瞭目的地址/端口,然後也可以用send函數發送數據,因爲此時send函數已經知道對方地址/端口,用getsockname()也可以得到這個信息。

    UDP客戶端在建立了插口後會直接用sendto()函數發送數據,還隱含了一個操作,那就是在發送數據之前,UDP會首先爲該插口選擇一個獨立的UDP端口(在1024—5000之間),將該插口置爲已綁定狀態。如果一個UDP客戶端建立插口後首先用bind()函數指明瞭本地地址/端口,也是可以的,這樣可以強迫UDP使用指定的端口發送數據。(事實上,UDP無所謂服務器和客戶端,這裏的界限已經模糊了。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章