UDP(User Datagram Protocol,用户数据报协定)是一种无连接的、不坚固的传输层协定。与TCP(传输把持协定)差别,UDP不供给数据包的次序保证、错误检测跟流量把持。这使得UDP在须要高速传输且对数据完全性请求不高的利用中非常受欢送,如视频流、在线游戏跟及时语音通信。
UDP通信基于IP协定,利用端口号来辨别差其余利用顺序。UDP通信的基本流程如下:
以下是一个简单的UDP通信示例,包含客户端跟效劳器端代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8888
int main() {
int sockfd;
struct sockaddr_in servaddr, cliaddr;
socklen_t len;
char msg[1024];
// 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
// 设置效劳器地点构造
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
// 绑定套接字
if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 接收数据
len = sizeof(cliaddr);
printf("Waiting for data...\n");
if (recvfrom(sockfd, (char *)msg, sizeof(msg), 0, (struct sockaddr *)&cliaddr, &len) < 0) {
perror("recvfrom failed");
exit(EXIT_FAILURE);
}
printf("Received message: %s\n", msg);
// 封闭套接字
close(sockfd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8888
int main() {
int sockfd;
struct sockaddr_in servaddr;
char msg[1024];
// 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
// 设置效劳器地点构造
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 发送数据
printf("Enter message: ");
scanf("%s", msg);
if (sendto(sockfd, (const char *)msg, strlen(msg), 0, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("sendto failed");
exit(EXIT_FAILURE);
}
// 封闭套接字
close(sockfd);
return 0;
}
经由过程以上示例,我们可能看到UDP通信在C言语中的实现方法。UDP通信实用于对及时性请求较高且对数据完全性请求不高的利用。在现实开辟中,我们可能根据须要抉择合适的协定,以实现高效的收集编程。