當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > udp編程步驟詳解,就是如此的簡單
UDP協(xié)議是User Datagram Protocol的簡稱,是一種無連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。
既然有了保證可靠傳輸?shù)腡CP協(xié)議,為什么還要非可靠傳輸?shù)腢DP協(xié)議呢?主要的原因有兩個(gè)。一是可靠的傳輸是要付出代價(jià)的,對(duì)數(shù)據(jù)內(nèi)容正確性的檢驗(yàn)必然占用計(jì)算機(jī)的處理時(shí)間和網(wǎng)絡(luò)的帶寬,因此TCP傳輸?shù)男什蝗鏤DP高。二是在許多應(yīng)用中并不需要保證嚴(yán)格的傳輸可靠性,比如視頻會(huì)議系統(tǒng),并不要求音頻視頻數(shù)據(jù)絕對(duì)的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會(huì)更合理一些。
UDP編程的服務(wù)器端一般步驟是:
1、創(chuàng)建一個(gè)socket,用函數(shù)socket();
2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();
4、循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom();
5、關(guān)閉網(wǎng)絡(luò)連接;
UDP編程的客戶端一般步驟是:
1、創(chuàng)建一個(gè)socket,用函數(shù)socket();
2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選
4、設(shè)置對(duì)方的IP地址和端口等屬性;
5、發(fā)送數(shù)據(jù),用函數(shù)sendto();
6、關(guān)閉網(wǎng)絡(luò)連接;
服務(wù)器端程序:
#include
#include
#include
#include
#include
#include
#include
#include
#define N 256
int main(int argc, char *argv[])
{
// 0定義變量
int serverfd;
int nbytes; //獲取接收到數(shù)據(jù)字節(jié)數(shù)
struct sockaddr_in serveraddr, clientaddr;
char buf[N];
int addrlen = sizeof(struct sockaddr_in);
if(argc < 3){
puts("server
return -1;
}
// 1創(chuàng)建UDP套接字--socket
serverfd = socket(AF_INET, SOCK_DGRAM, 0);
if(serverfd < 0){
perror("socket err");
return -1;
}
// 2定義套接字地址--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回發(fā)給客戶端 sendto
sendto(serverfd, "hello", 6, 0, (struct sockaddr*)&clientaddr, addrlen);
}
// 6關(guān)閉套接字--close
close(serverfd);
}
客戶端程序:
#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創(chuàng)建UDP套接字--socket
clientfd = socket(AF_INET, SOCK_DGRAM, 0);
if(clientfd < 0){
perror("socket err");
return -1;
}
// 2指定服務(wù)器地址--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發(fā)送消息給服務(wù)器 sendto
gets(buf);
sendto(clientfd, buf, N, 0, (struct sockaddr*)&serveraddr, addrlen);
// 4接收服務(wù)器的消息 recvfrom
recvfrom(clientfd, buf, N, 0, (struct sockaddr*)&serveraddr, &addrlen);
printf("%s\n", buf);
}
// 5關(guān)閉套接字--close
close(clientfd);
}