udp編程(cheng)步驟詳(xiang)解,就是(shi)如此的簡(jian)單(dan)
時間:2018-07-19 來源:未(wei)知
UDP協議是User Datagram Protocol的(de)(de)(de)(de)簡稱,是一(yi)種無連接的(de)(de)(de)(de)協議,每個數據報(bao)都(dou)是一(yi)個獨立的(de)(de)(de)(de)信(xin)息(xi),包括(kuo)完整的(de)(de)(de)(de)源地(di)址或(huo)目的(de)(de)(de)(de)地(di)址,它在網絡(luo)上(shang)以(yi)任何(he)可(ke)能(neng)的(de)(de)(de)(de)路徑傳(chuan)往目的(de)(de)(de)(de)地(di),因此(ci)能(neng)否到達(da)目的(de)(de)(de)(de)地(di),到達(da)目的(de)(de)(de)(de)地(di)的(de)(de)(de)(de)時間以(yi)及內(nei)容的(de)(de)(de)(de)正確性都(dou)是不能(neng)被(bei)保證的(de)(de)(de)(de)。
既然有了(le)保證可(ke)靠傳(chuan)(chuan)輸(shu)的(de)(de)(de)(de)TCP協(xie)議,為什么還要(yao)(yao)非可(ke)靠傳(chuan)(chuan)輸(shu)的(de)(de)(de)(de)UDP協(xie)議呢?主要(yao)(yao)的(de)(de)(de)(de)原因(yin)有兩個(ge)。一是(shi)(shi)可(ke)靠的(de)(de)(de)(de)傳(chuan)(chuan)輸(shu)是(shi)(shi)要(yao)(yao)付(fu)出代(dai)價的(de)(de)(de)(de),對(dui)數(shu)據內容(rong)正(zheng)(zheng)確性的(de)(de)(de)(de)檢驗必然占用(yong)計算機的(de)(de)(de)(de)處理(li)時間和(he)網絡的(de)(de)(de)(de)帶寬,因(yin)此(ci)TCP傳(chuan)(chuan)輸(shu)的(de)(de)(de)(de)效率不(bu)如UDP高。二是(shi)(shi)在許多應用(yong)中并不(bu)需(xu)要(yao)(yao)保證嚴格的(de)(de)(de)(de)傳(chuan)(chuan)輸(shu)可(ke)靠性,比如視頻會議系統,并不(bu)要(yao)(yao)求音(yin)頻視頻數(shu)據絕對(dui)的(de)(de)(de)(de)正(zheng)(zheng)確,只(zhi)要(yao)(yao)保證連貫性就可(ke)以了(le),這種情(qing)況下顯然使用(yong)UDP會更合理(li)一些。
UDP編程的服務器端一(yi)般(ban)步驟(zou)是:
1、創建一個socket,用(yong)函數socket();
2、設置(zhi)socket屬(shu)性(xing),用(yong)函數setsockopt();* 可選(xuan)
3、綁定IP地址、端口等信息到socket上,用函數bind();
4、循環接收數(shu)據,用函數(shu)recvfrom();
5、關閉網(wang)絡連接;
UDP編程(cheng)的客戶端(duan)一般步驟(zou)是(shi):
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、端口等(deng)信息到socket上,用(yong)函數bind();* 可選
4、設置對方的IP地址和端口(kou)等屬性;
5、發(fa)送(song)數(shu)(shu)據,用(yong)函(han)數(shu)(shu)sendto();
6、關閉網(wang)絡連(lian)接;
服務器端程(cheng)序(xu):
#include
#include
#include
#include
#include
#include
#include
#include
#define N 256
int main(int argc, char *argv[])
{
// 0定義變量
int serverfd;
int nbytes; //獲取接收到數(shu)據字節數(shu)
struct sockaddr_in serveraddr, clientaddr;
char buf[N];
int addrlen = sizeof(struct sockaddr_in);
if(argc < 3){
puts("server
return -1;
}
// 1創建UDP套接字(zi)--socket
serverfd = socket(AF_INET, SOCK_DGRAM, 0);
if(serverfd < 0){
perror("socket err");
return -1;
}
// 2定義套接(jie)字(zi)地(di)址--sockaddr_in
bzero(&serveraddr, addrlen);
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
// 3綁定套接字--bind
if(bind(serverfd, (struct sockaddr*)&serveraddr, addrlen) < 0){
perror("bind err");
return -1;
}
while (1) {
// 4接受來自客戶端消息 recvfrom
recvfrom(serverfd, buf, N, 0, (struct sockaddr*)&clientaddr, &addrlen);
printf("recv data = %s\n", buf);
// 5回發給客戶(hu)端 sendto
sendto(serverfd, "hello", 6, 0, (struct sockaddr*)&clientaddr, addrlen);
}
// 6關閉套接字(zi)--close
close(serverfd);
}
客戶端程(cheng)序(xu):
#include
#include
#include
#include
#include
#include
#include
#include
#define N 256
int main(int argc, char *argv[])
{
// 0定義變量
int clientfd;
struct sockaddr_in serveraddr;
char buf[N] = {0};
int addrlen = sizeof(struct sockaddr_in);
if(argc < 3){
puts("client
return -1;
}
// 1創建UDP套(tao)接字(zi)--socket
clientfd = socket(AF_INET, SOCK_DGRAM, 0);
if(clientfd < 0){
perror("socket err");
return -1;
}
// 2指定服務器地址(zhi)--sockaddr_in
bzero(&serveraddr, addrlen);
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
while (1) {
// 3發送消息給服務器 sendto
gets(buf);
sendto(clientfd, buf, N, 0, (struct sockaddr*)&serveraddr, addrlen);
// 4接收服務器的(de)消息 recvfrom
recvfrom(clientfd, buf, N, 0, (struct sockaddr*)&serveraddr, &addrlen);
printf("%s\n", buf);
}
// 5關閉套(tao)接字--close
close(clientfd);
}

