ZBLOG

C++ UDP 通信实例

以下是一个简单的 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.cppudp_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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=5995

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?