udp的過程通訊看上去比tcp簡單一些,但也有許多細節需要注意。比如,udp套接字使用前不必連線,tcp類似於**通訊,udp類似於郵件通訊,udp套接字就像乙個郵箱,可以把許多不同**的信件或包裹放入其中。因此,在示例udpechoclient.c中,是需要用sockaddrsequal()來檢測回送的資料報是否是之前所送往的伺服器回送的,儘管在示例中不太可能出現這種情況。
程式使用的位址結構、套接字的建立還是與tcp相差無幾。由於沒有建立連線的步驟,不需要呼叫listen(),一旦套接字具有位址就準備好接受訊息。同時udp也不需要使用accept()為每個客戶獲取乙個新的套接字,而是利用繫結到想要埠號的相同套接字立即呼叫recvfrom()。這樣,在接收資料報的同時需要獲知起**。以下是傳送和接收用到的函式。
ssize_t sendto(intsocket,
const
void
*msg, size_t msglength,
intflags,
const
struct
sockaddr
*destaddr, socklen_t addrlen)
//前4個引數與send()相同,另外兩個指向訊息的目的地
ssize_t recvfrom(
intsocket,
void
*msg, size_t msglength,
intflags,
struct
sockaddr
*srcaddr,socklen_t
*addrlen)
//前4個引數與recv()相同,另外兩個告知呼叫者所接受的資料報的**
//addrlen是乙個輸入/輸出型的引數,需要傳遞乙個指標
tcp 呼叫send()時,資料已經複製進緩衝區中以進行傳輸,可能不會實際的傳輸;udp不會重傳,這意味著當其呼叫sendto()時,就已經把訊息傳遞給底層,並且已經(或者很快將要)傳送出去。
udp對不同訊息的位元組保留邊界,recvfrom()不會返回多個資料塊。當引數設定小於第乙個資料塊大小時,剩餘位元組將會被丟棄而無指示。因此緩衝區應該大於協議允許的最大訊息,其最大負載是65507位元組。
udp 套接字上呼叫connect()可以用於固定通過套接字傳送的將來資料報的目的位址。一旦連線,可以用send()代替sendto()、recv()代替recvfrom(),但這不改變udp的行為方式。
初學Sockets程式設計 三 UDP套接字
udp的過程通訊看上去比tcp簡單一些,但也有許多細節需要注意。比如,udp套接字使用前不必連線,tcp類似於 通訊,udp類似於郵件通訊,udp套接字就像乙個郵箱,可以把許多不同 的信件或包裹放入其中。因此,在示例udpechoclient.c中,是需要用sockaddrsequal 來檢測回送的...
初學Sockets程式設計 一 基本的TCP套接字
struct sockaddr struct in addr struct sockaddr in struct in addr struct sockaddr in6 int inet pton intaddressfamily,const char src void dst 把位址從可列印的字串...
初學Sockets程式設計 四 傳送和接收資料
放假歸來,半個月沒看書了,稍微有些生疏。被安排了新的工作,老的自學任務還需繼續完成。這一章內容比較多,按小節整理了一下。一 編碼整數 1.整數型的大小 由通訊過程雙方交換資訊的協議標準引申出了編碼的整數,進而 了各個整數型別的大小 char int long int8 t uint8 t等 獲取它們...