UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输层协议。它提供了一种快速且高效的数据传输方式,适用于对实时性要求较高的应用,如视频会议、在线游戏等。与TCP不同,UDP不保证数据包的顺序和可靠性,因此它更适合那些可以容忍一定数据丢失的应用场景。
以下是一个简单的Linux下C语言的UDP客户端和服务器示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8888
#define BUFFER_SIZE 1024
int main() {
int sockfd;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
char buffer[BUFFER_SIZE];
// 创建UDP套接字
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}
// 绑定地址和端口
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("bind");
close(sockfd);
exit(1);
}
printf("Server listening on port %d\n", PORT);
while (1) {
// 接收数据
int recv_len = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len);
if (recv_len == -1) {
perror("recvfrom");
continue;
}
buffer[recv_len] = '\0';
printf("Received message: %s\n", buffer);
// 发送响应
sendto(sockfd, "Message received", strlen("Message received"), 0, (struct sockaddr *)&client_addr, addr_len);
}
close(sockfd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8888
#define BUFFER_SIZE 1024
int main() {
int sockfd;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
// 创建UDP套接字
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}
// 设置服务器地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);
// 发送数据
const char *message = "Hello, UDP Server!";
sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
// 接收响应
int recv_len = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, NULL, NULL);
if (recv_len == -1) {
perror("recvfrom");
} else {
buffer[recv_len] = '\0';
printf("Server response: %s\n", buffer);
}
close(sockfd);
return 0;
}
通过以上内容,您可以全面了解Linux下C语言的UDP编程基础、优势、应用场景以及常见问题及其解决方法。
领取专属 10元无门槛券
手把手带您无忧上云