Linux 網路程式設計五(UDP協議)

2021-09-08 01:30:37 字數 3467 閱讀 2013

udp和tcp的對比

--udp處理的細節比tcp少。

--udp不能保證訊息被傳送到目的地。

--udp不能保證資料報的傳遞順序。

--tcp處理udp不處理的細節。

--tcp是面向連線的協議

--udp是無連線協議

--tcp保持乙個連線

--udp只是把資料傳送出去而已

tcp的優點

--tcp提供以認可的方式顯示的建立連線和終止連線。

--tcp保證可靠的,順序的以及不會重複的資料傳輸。

--tcp處理流控制。

--tcp允許資料優先。

--如果資料沒有傳送到,tcp套接字會返回出錯提示。

--tcp通過保持連線並將資料塊分成更小的分片來處理大資料,而無需程式設計師編碼處理。

tcp的缺點

--tcp需要建立並保持乙個連線,給系統帶來很大開銷。

--tcp資料傳輸效率低。

併發機制

1.增加server數量

2.多層結構

一台server同事支援1000個client

中介軟體對於普通使用者來講是server,對於server是client,乙個中介軟體同時支援1000個client

中介軟體會遍歷自己管理的1000個client,發現client需要連線server,才會將請求傳送給server,不需要連線server的client就不向server傳送請求

多層結構的原理:利用不是client在同一時間內都需要向server傳送請求,永遠只有部分使用者需要傳送請求。

udp的優點

--udp不要求保持乙個連線

--udp沒有因接收方沒有收到資料報重傳而帶來開銷。

--設計udp目的是用於短應用和控制訊息。

--在乙個資料報接乙個資料報基礎上,udp要求的網路頻寬比tcp小。

udp的缺點

--程式設計師必須建立**監測資料報的正確性,必要時重傳。

--程式設計師必須把大資料報分片。

選擇使用哪一種協議?

--一些訊息重要程度不高,或者有規律重複,可以使用udp。

--如果要傳輸乙個重要的資料,丟失一點就會破壞整個資料,那麼需要選擇tcp。

--telnet,ssh,http等基本都基於tcp。

--流**為了保證很窄的網路頻寬來傳送更多的資料,基本採用udp。

多數遊戲中,丟失來自某個使用者的狀態更新可能不會引起注意,所以採用udp。

設計用在區域網的應用可以採用udp,因為在區域網中丟失資料報的可能性很低。

使用udp與tcp所用的**基本類似,唯一的區別在於socket函式呼叫的時候的乙個引數不同

int socket(int domain,int type,int

protocol);

引數type為sock_stream代表tcp,sock_dgram代表udp。

對於tcp和udp都可以使用recvfrom函式,但recv只能tcp使用。

使用udp傳送資料。

ssize_t sendto(

int s,const

void *buf,size_t len,int flags,const

struct sockaddr *to,socklen_t tolen);

引數s是指套接字描述符

引數buf是傳送資料buf記憶體位址指標

引數len是傳送資料的長度

引數flags一般傳0

引數to是結構sockaddr的記憶體位址指標

引數tolen是結構sockaddr的大小

udp不需要握手機制,也不需要確認另乙個系統是否有服務端在listen。

成功返回傳送的位元組數,失敗返回-1,並且設定errno

使用udp接收資料

ssize_t recvfrom(

int s,void * buf,size_t blen,int flags,struct sockaddr * from

,socklen_t * fromlen);

成功返回接收位元組數,失敗返回-1,並且設定errno;udp不同於tcp/ip,就算傳送端關閉,recvfrom也不會返回0,因為udp是無連線協議。

udp不需要listen,bind之後就可以接受資料了。

recv函式只是從udp快取中讀資料(此時資料已經在自己的電腦上了),不是直接從網路中讀資料,什麼時候udp快取區滿了,另一邊的send函式才會停止傳送資料。

udp傳送廣播訊息

ip位址由四個位元組組成,每個位元組十進位制是0時,表示本機,十進位制是255就是廣播訊息,

例如:192.168.1.255這就是在 192.168.1

.x這個區域網中廣播訊息

但是255.

255.255

.255並無法在全世界廣播訊息,因為路由器會遮蔽區域網中廣播訊息,不會傳遞到公網上。

**如下

int on = 1

;if (setsockopt(st, sol_socket, so_broadcast, &on, sizeof(on)) == -1

)

sendto和recvform

在udp中,當udp接收端,只要bind埠號,sendto傳送的資料就會快取到接收端的udp快取區中,如果快取區已滿,那麼sendto函式便會報錯(資訊過長錯誤)。

將網域名稱轉化為ip位址

const

char *getipaddrbvhostname(const

char *hostname)

;

struct hostent *h;

h=gethostbyname(hostname);

strcpy(s,inet_ntoa(*((struct in_addr *)h->h_addr)));

return

s;}

將struct sockaddr_in轉化為ip位址

const

char *getipaddrbvaddr(struct sockaddr_in *client_addr)

void sockaddr_toa(const

struct sockaddr_in *addr,char *ipaddr)

inet_ntoa()函式是乙個執行緒不安全函式,這個函式返回的是字串,

獲取socket自身的sockaddr

int getsockname(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

獲取socket連線的遠端sockaddr

int getpeername(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

網路程式設計 UDP協議

udp協議 服務端1 2 udp 協議 又稱 資料報協議 sock dgram34 5 from socket import 一般不這樣做 會重名 但寫socket可以這樣寫 因為要用到太多 會有大量的socket.67 server socket af inet,sock dgram 8 serv...

網路程式設計之UDP協議

將資料及源和目的封裝成資料報,不需要建立連線。每個資料報的大小限制在64k內。因無連線,是不可靠的協議,但是速度快。客戶端 1 建立udp傳輸的傳送端 2 建立udp的socket服務 3 將要傳送的資料封裝到資料報中 4 通過udp的socket服務獎資料報傳送過去 5 關閉socket服務 pu...

網路程式設計之UDP協議

1 實現的功能 能夠傳送和接收訊息,並且在發生886後退出 2 chatroom 類 public class chatroom 3 傳送執行緒sendthread 類public class sendthread implements runnable override public void r...