36 UDP套接字之有連線通訊

2021-09-21 17:48:58 字數 1739 閱讀 3219

上一節最後發現服務端不存在客服端並不知道, 會被一直阻塞.

如果你忘了啟動服務端, 你會發現客服端依舊被阻塞了, 並且沒有報錯. 而且傳送資料即使沒有收到應答的資料也沒有報錯, 程式仍然處於阻塞狀態.

其實在客服端與服務端主機傳送udp資料報之前, 需要一次arp請求和應答交換(我是在乙個主機上實驗, 所以無法抓取到).

我們在通過抓包可以看到,服務端會響應乙個port unreachable的icmp應答, 不過這個icmp並不會返回給客戶程序, 這個錯誤是sendto導致的, 而sendto將資料傳送出去之後就返回成功了, 而icmp是在之後才發出來, 所以這個錯誤也稱icmp非同步錯誤.

這個錯誤只會在已連線時, 才會返回給客服程序. 說了這麼多次已連線, 那麼接下來我們就來看一下怎麼才能讓udp已連線.

客服端通過呼叫connect完成udp已連線的狀態, 但不同於tcp, udp呼叫connect不會出現三次握手的現象, 只是用來記錄對端的ip位址和埠號, 然後返回給呼叫程序.

已連線的udp相對於未連線的udp發生部分變化 :

注意 : udp使用connect沒有三次握手並使connect並不會阻塞, 而是直接返回.

服務端的**不用就行修改, 客服端的**修改如下 :

完整** : connect_client.c

#include

#include

#include

#include

#include

#include

#include

#include

#define error(s)

intmain

(int argc,

char

*ar**)

close

(fdclinet)

;return0;

}

我們再來浮現服務端未啟動的問題, 看下此時會是什麼情況.

當客服端傳送資料資料後會收到recvfrom(或者read)會icmp非同步錯誤, 所以直接就退出連線了.

對於tcp來說客服端只能呼叫一次connect函式, 而udp卻不這樣, udp呼叫connect只是讓udp連線並沒有其他含義, 所以可以多次呼叫connect函式.

connect呼叫過程 :

udp通訊會經歷三個步驟 :

建立連線

輸出資料報

最後斷開連線

而使用未連線udp每次傳送資料都會重複上述上個步驟, 即使是同一服務端通訊也是如此. 使用已連線udp建立連線後會重複步驟二直到斷開連線. 也不難理解未連線udp通訊大約會耗費udp傳輸的三分之一開銷. 所以, 如果給同一目的位址連續的傳送資料, 則使用已連線udp更加高效.

網路套接字程式設計介紹 UDP通訊

知識內容 1.udp通訊程式設計流程 2.套接字介面介紹 一 udp通訊程式設計 1.建立套接字 在核心中建立乙個socket結構體,返回乙個檔案描述符作為操作控制代碼,用於使程序與網絡卡之間建立聯絡 2.為套接字繫結位址資訊 在核心的socket結構體中新增描述資訊 位址資訊 告訴作業系統自己使用...

基於UDP協議通訊的套接字

udp協議沒有粘包問題,但是緩衝區大小要足夠裝資料報大小,建議不要超過 512 服務端 服務端 import socket server socket.socket socket.af inet,socket.sock dgram 資料報協議 udp server.bind 127.0.0.1 80...

面向連線的套接字通訊

面向連線的套接字通訊 1.面向連線的套接字通訊工作流程 1 伺服器先也能夠 socket 函式來建立乙個套接字,用這個套接字完成通訊的監聽。2 用 bind 函式來繫結乙個埠號和 ip位址。3 伺服器呼叫 listen 函式,使伺服器的這個埠和 ip處於監聽狀態,等待客戶機的連線。4 客戶機用 so...