對UDP執行connect()操作產生的問題

上面一篇文章說到一些網絡操作常用的函數,現在補充一下。

對於UDP來說,不存在connect()一說,因爲UDP本身沒有建立連接、三次握手之說,那是TCP的事,但是如果在程序中對UDP套接字執行了connect會產生什麼狀況?

對UDP執行connect(),並沒有進行真正地連接操作,而相當於給對應的套接字設置了目的地址:端口,此後對該套接字可以直接使用send(),recv()發送數據和接收數據。 需要注意的是對於原來的sendto()函數,則不需再指定地址,若指定地址則只能指定和connect()指定的地址是同一個地址,否則協議棧會提示 Invalid argument !,對於recvfrom()函數來說,調用了connect之後,就只能收到來之connect()指定的地址的數據包。就是說對udp調用了connect()之後,實際上限制了通訊的對象。
同時,調用了connect之後的套接字,若引發異步錯誤,協議棧則返回錯誤狀態給它們所在的進程,比如調用了connect之後,再把數據發送到一個很明顯不可達的地址,協議棧會返回錯誤給進程。或者發送一個數據包到本地主機的某個端口,然後該端口並沒有進程在監聽,那麼協議棧也會把這個消息告知進程,對於沒有”連接”的UDP,進程不會收到異步錯誤通知。

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