基於UDP的伺服器端和客戶端

2021-10-21 05:59:42 字數 2333 閱讀 1357

前面我們想過了tcp方式的,現在我們說下udp套接字的方式,內容較少,但是很實用。

下面通過信件說明udp的工作原理,這是講解udp時使用的傳統示例,它與udp特性完全相符。寄信前應先在信封上填好寄信人和收信人的位址,之後貼上郵票放進郵筒即可。當然,信件的特點使我們無法確認對方是否收到。另外,郵寄過程中也可能發生信件丟失的情況。也就是說,信件是一種不可靠的傳輸方式。與之類似,udp提供的同樣是不可靠的資料傳輸服務。

如果只考慮可靠性,tcp的確比udp好。但udp在結構上比tcp更簡潔。udp不會傳送類似ack的應答訊息,也不會像seq那樣給資料報分配序號。因此,udp的效能有時比tcp高出很多。程式設計中實現udp也比tcp簡單。另外,udp的可靠性雖比不上tcp,當也不會像想像中那麼頻繁地發生資料損毀。因此,在更重視效能而非可靠性的情況下,udp是一種很好的選擇。

流控制是區分ydp和tcp的最重要標誌。但若從tcp中除去流控制,所剩內容也屈指可數。也就是說,tcp的生命在於流控制。在前面講過的「與對方套接字連線及斷開連線過程」也屬於流控制的一部分。

那麼,udp最重要的作用就是將傳送機的資料報交付給目標機的udp套接字,也就是某個埠,某個程式。實現端到端的連線。

2、udp的高效使用3、實現基於udp的伺服器端/客戶端

接下來通過之前介紹的udp理論實現真正的程式。

3.1udp中伺服器端和客戶端沒有連線

udp伺服器端/客戶端不像tcp那樣在連線狀態下交換資料,因此與tcp不同,無需經過連線過程。也就是說,不必呼叫tcp連線過程中呼叫的listen函式和accept函式。udp中只有建立套接字的過程和資料交換過程。

3.2udp伺服器端和客戶端均只需1個套接字

tcp中,套接字之間應該是一對一的關係。若要向10個客戶端提供服務,則除了守門的伺服器套接字外,還需要10個伺服器端套接字。但在udp中,不管伺服器端還是客戶端都只需要1個套接字。之前解釋udp原理時舉了信件的例子,收發信件時使用的郵筒可以比喻為udp套接字。只要附近有1個郵筒,就可以通過它向任意位址寄出信件。同樣,只需1個udp套接字就可以向任意主機傳輸資料。

3.3、基於udp的資料i/o函式

建立好tcp套接字後,傳輸資料時無需再新增位址資訊。因為tcp套接字將保持與對方套接字的連線。換言之,tcp套接字知道目標位址資訊。但udp套接字不會保持連線狀態(udp套接字只有簡單的郵筒功能),因此每次傳輸資料都要新增目標位址資訊。這相當於寄信前在信件中填寫位址。接下來節掃填寫位址並傳輸資料時呼叫的udp相關函式。

#include 

ssize_t sendto(

int sock, void *buf, size_t nbytes,

int flags,

strutc sockaddr *to, socklen_t addrlen);/

** 成功時返回傳輸的位元組數,失敗時返回-

1* sock 用於傳輸資料的udp套接字檔案描述符

* buff 儲存待傳輸資料的緩衝位址值

* nbytes 待傳輸的資料長度,以位元組為單位

* flags 可選項引數,若沒有則傳遞0

* to 存有目標位址資訊的sockaddr結構體變數的位址值

* addrlen 傳遞給引數to的位址值結構體變數長度

*/

上述函式與之前的tcp輸出函式最大的區別在於,此函式需要向它傳遞目標位址資訊。接下來介紹接收udp資料的函式。udp資料的傳送端並不固定,因此該函式定義為可接收傳送端資訊的形式,也就是將同時返回udp資料報中的傳送端資訊。

#include 

ssize_t recvfrom(

int sock, void *buff, size_t nbytes,

int flags,

struct sockaddr *

from

, socklen_t *addrlen);/

** 成功時返回接收的位元組數,失敗時返回-

1* sock 用於接收資料的udp套接字檔案描述符

* buff 儲存接收資料的緩衝位址值

* nbytes 可接收的最大位元組數,故無法超過引數buff所指的緩衝大小

* flags 可選項引數,若沒有則傳入0

*from 存有傳送端位址資訊的sockaddr結構體變數的位址值

* addrlen 儲存引數from的結構體變數長度的變數位址值

*/

編寫udp程式是最核心的部分就在於上述兩個函式,這也說明二者在udp資料傳輸中的地位。

基於UDP的伺服器端和客戶端

前面的文章中我們給出了幾個tcp的例子,對於udp而言,只要能理解前面的內容,實現並非難事。udp不像tcp,無需在連線狀態下交換資料,因此基於udp的伺服器端和客戶端也無需經過連線過程。也就是說,不必呼叫 listen 和 accept 函式。udp中只有建立套接字的過程和資料交換的過程。tcp中...

基於UDP的伺服器端和客戶端

前面的文章中我們給出了幾個 tcp 的例子,對於 udp 而言,只要能理解前面的內容,實現並非難事。udp 不像 tcp,無需在連線狀態下交換資料,因此基於 udp 的伺服器端和客戶端也無需經過連線過程。也就是說,不必呼叫 listen 和 accept 函式。udp 中只有建立套接字的過程和資料交...

6 1 基於UDP的伺服器端 客戶端

1.udp套接字原理 可靠性方面來說,tcp的確比udp好,但是udp的結構比tcp簡潔,不會傳送類似ack應答訊息,也不會有seq序號,效能有時比tcp高出很多。同時區分tcp和udp的重要標誌是流控制 tcp的生命在於流控制。圖中,ip的作用是讓離開主機b的udp資料報準確傳送到主機 但是最終交...