C 简单的UDP客户端与服务端

后端思维 2025-01-21 ⋅ 39 阅读

1. 什么是UDP?

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输协议。它通过将数据打包成数据报,然后直接发送给接收方,不需要在建立连接和维护状态方面做额外的工作。UDP适用于需要高效传输数据,但可靠性要求相对较低的场景。

2. UDP客户端

2.1 实现步骤

以下是实现UDP客户端的简单步骤:

  1. 创建UDP套接字
  2. 设置服务器地址和端口号
  3. 构造发送数据报
  4. 发送数据报给服务器
  5. 关闭套接字

2.2 示例代码

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>

int main() {
    int sockfd;
    char buffer[1024];
    struct sockaddr_in servaddr;

    // 创建UDP套接字
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        std::cerr << "创建套接字失败" << std::endl;
        return 1;
    }

    // 设置服务器地址和端口号
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(12345);
    servaddr.sin_addr.s_addr = INADDR_ANY;

    // 构造发送数据报
    const char* message = "Hello, server!";
    int message_length = strlen(message) + 1;

    // 发送数据报给服务器
    sendto(sockfd, message, message_length, 0, (struct sockaddr*)&servaddr, sizeof(servaddr));

    std::cout << "消息已发送给服务器" << std::endl;

    // 关闭套接字
    close(sockfd);

    return 0;
}

3. UDP服务端

3.1 实现步骤

以下是实现UDP服务端的简单步骤:

  1. 创建UDP套接字
  2. 设置服务器地址和端口号
  3. 绑定套接字到服务器地址和端口号
  4. 接收数据报
  5. 处理接收到的数据报
  6. 关闭套接字

3.2 示例代码

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>

int main() {
    int sockfd;
    char buffer[1024];
    struct sockaddr_in servaddr, cliaddr;

    // 创建UDP套接字
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        std::cerr << "创建套接字失败" << std::endl;
        return 1;
    }

    // 设置服务器地址和端口号
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(12345);
    servaddr.sin_addr.s_addr = INADDR_ANY;

    // 绑定套接字到服务器地址和端口号
    if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
        std::cerr << "绑定套接字失败" << std::endl;
        close(sockfd);
        return 1;
    }

    while (true) {
        socklen_t len = sizeof(cliaddr);

        // 接收数据报
        int message_length = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&cliaddr, &len);
        buffer[message_length] = '\0';

        std::cout << "接收到客户端的消息: " << buffer << std::endl;

        // 处理接收到的数据报
        // ...

        // 关闭套接字
        close(sockfd);
    }

    return 0;
}

4. 总结

通过本文,我们了解了如何使用C++编写简单的UDP客户端和服务端。UDP提供了一种高效传输数据的方式,适用于可靠性要求相对较低的场景。在实际开发中,我们可以根据具体需求对UDP进行进一步扩展和优化。


全部评论: 0

    我有话说: