以下是一个简单的 C++ UDP 通信示例,包括一个服务器和一个客户端。这个示例使用了标准的 POSIX 套接字 API,适用于 Unix/Linux 系统。
1. UDP 服务器端
#include <iostream>
#include <cstring>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 12345
#define BUFFER_SIZE 1024
int main() {
int sockfd;
char buffer[BUFFER_SIZE];
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
// 创建UDP套接字
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
std::cerr << "Socket creation failed!" << std::endl;
return -1;
}
// 清空结构体并设置地址信息
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET; // IPv4
server_addr.sin_addr.s_addr = INADDR_ANY; // 任意可用的地址
server_addr.sin_port = htons(PORT); // 设置端口号
// 绑定套接字到指定端口
if (bind(sockfd, (const struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
std::cerr << "Bind failed!" << std::endl;
close(sockfd);
return -1;
}
std::cout << "UDP Server is up and listening..." << std::endl;
while (true) {
// 接收数据
int n = recvfrom(sockfd, buffer, BUFFER_SIZE, MSG_WAITALL,
(struct sockaddr*)&client_addr, &addr_len);
buffer[n] = '\0'; // null-terminate the received string
std::cout << "Received message: " << buffer
<< " from " << inet_ntoa(client_addr.sin_addr)
<< ":" << ntohs(client_addr.sin_port) << std::endl;
// 可选:回送消息给客户端
const char* response_message = "Message received!";
sendto(sockfd, response_message, strlen(response_message),
MSG_CONFIRM, (const struct sockaddr*)&client_addr,
addr_len);
std::cout << "Response sent to client." << std::endl;
}
close(sockfd);
return 0;
}
2. UDP 客户端
#include <iostream>
#include <cstring>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 12345
#define BUFFER_SIZE 1024
int main() {
int sockfd;
char buffer[BUFFER_SIZE];
struct sockaddr_in servaddr;
// 创建UDP套接字
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
std::cerr << "Socket creation failed!" << std::endl;
return -1;
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET; // IPv4
servaddr.sin_port = htons(PORT); // 设置服务端口
// 将服务器地址转换为网络字节序(IP)
if(inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr)<=0) {
std::cerr << "Invalid address/ Address not supported!" << std::endl;
return -1;
}
const char* message = "Hello, UDP Server!";
// 向服务器发送消息
sendto(sockfd,message,sizeof(message),MSG_CONFIRM,(const struct sockaddr *) &servaddr,sizeof(servaddr));
std::cout<<"Message sent to server."<<std::endl;
// 接收来自服务器的响应 (可选)
socklen_t len = sizeof(servaddr);
int n = recvfrom(sockfd , buffer , BUFFER_SIZE , MSG_WAITALL ,(struct sockaddr*) &servaddr , &len);
buffer[n] = '\0'; // null-terminate the received string
std::cout<<"Server : "<<buffer<<std::endl;
close(sockfd);
return 0;
}
如何编译和运行
编译程序
你可以将上面的代码分别保存为 udp_server.cpp
和 udp_client.cpp
文件。然后在终端中使用以下命令编译:
g++ udp_server.cpp -o udp_server
g++ udp_client.cpp -o udp_client
启动服务器
首先,启动 UDP 服务器:
./udp_server
启动客户端
然后,在另一个终端窗口中运行 UDP 客户端:
./udp_client
实现说明
创建套接字:使用
socket()
函数创建一个 UDP 套接字。绑定地址:在服务器中使用
bind()
将套接字与指定的 IP 地址和端口绑定,以便监听传入的数据包。发送和接收数据:使用
sendto()
和recvfrom()
函数来发送和接收数据。UDP 是无连接的,因此不需要建立连接,只需知道对方的 IP 地址和端口即可进行通信。
通过这些示例代码,你可以理解如何实现基本的 UDP 通信。根据实际需求,可以添加更多功能,比如错误处理、超时重传等。
内容由零声教学AI助手提供,问题来源于学员提问