計算機網路基於UDP的伺服器和客戶端

2021-08-03 02:02:33 字數 1988 閱讀 7252

udp和tcp所不同的是,由於udp是無連線的,所以就不用監聽listen和accept這兩個步驟,比起tcp 就顯得簡單了很多。另外,udp當中收發資料,發的是資料報,收必須以資料報收回。

userver.c

#include

#include

#include

#include

#include

#include

#include

#include

#define port 1234  

#define maxdatasize 100  

int main(int argc, char *argv)  

if ((he=gethostbyname(argv[1]))==null)  

if ((sockfd=socket(af_inet, sock_dgram,0))==-1)  

bzero(&server,sizeof(server));  

server.sin_family = af_inet;  

server.sin_port = htons(port);  

server.sin_addr= *((struct in_addr *)he->h_addr);  

sendto(sockfd, argv[2],strlen(argv[2]),0,(struct sockaddr *)&server,sizeof(server));  

socklen_t  addrlen;  

addrlen=sizeof(server);  

while (1)  

if (addrlen != sizeof(server) ||memcmp((const void *)&server, (const void *)&peer,addrlen) != 0)  

buf[num]='\0';  

printf("server message:%s\n",buf);  

break;  

}  close(sockfd);  

}  

uclient.c

#include

#include

#include

#include

#include

#include

#include

static void use(char* proc)

int main(int argc,char* argv)

int sock =socket(af_inet,sock_dgram,0) ;

struct sockaddr_in peer;

peer.sin_family = af_inet;

peer.sin_port = htons(atoi(argv[2]));

peer.sin_addr.s_addr = inet_addr(argv[1]);

char buf[1024];

while(1)

}ssize_t r =recvfrom(sock,buf,sizeof(buf)-1,0,null,null);

if(r<0)

else

}close(sock);

return 0;}

執行結果:

那麼既然udp是不可靠的,那怎麼保證可靠性呢?

傳輸層無法保證資料的可靠傳輸,只能通過應用層來實現。實現的方式與tcp類似,只是實現不在傳輸層,實現轉移到了應用層。

實現確認機制、重傳機制、視窗確認機制。

如果你不利用linux協議棧以及上層套接字,自己通過抓包和發包的方式去實現可靠性傳輸,那麼必須實現如下功能:

傳送:包的分片、包確認、包的重發

接收:包的調序、包的序號確認

目前有如下開源程式利用udp實現了可靠的資料傳輸。分別為rudp、rtp、udt。

計算機網路 TCP和UDP

我們說了tcp是可靠連線,那麼是不是tcp一定就優於udp呢?tcp和udp之間的額優點和缺點,不能簡單絕對的進行比較 udp 在傳送資料之前不需要先建立連線。對方的傳輸層在收到 udp 報文後,不需要給出任何確認。雖然 udp 不提供可靠交付,但在某些情況下 udp 是一種最有效的工作方式。tcp...

計算機網路 UDP協議

源埠與目的埠 可與tcp埠重複。udp長度 包括首部長度和資料長度,單位為位元組,注意資料長度可以為0。udp檢驗和 校驗的是udp首部部分和資料部分,該校驗和是可選的,如果全部填0則表示傳送端沒有計算校驗和。udp資料報有12個位元組的偽首部 源ip,目的ip,8bit 0,8位協議,udp長度 ...

計算機網路 UDP的connect

udp的connect udp是無連線的協議,不需要connect可以直接使用sendto sendmsg等攜帶對端資訊的函式對資料進行傳送接收,但是其實udp的socket也是可以進行connect的。在udp中,使用sendto資料傳輸過程分三階段 a.向udp套接字註冊目標ip和埠號 b.傳輸...