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.傳輸...