📜  UDP Server-Client在C中的实现(1)

📅  最后修改于: 2023-12-03 15:20:47.401000             🧑  作者: Mango

UDP Server-Client在C中的实现

本文将介绍如何使用C语言实现UDP协议的服务器-客户端通信。UDP(User Datagram Protocol)是一种无连接的协议,适用于需要快速传输数据而不需要可靠性的场景。

UDP协议基本概念
  • UDP是一种无连接的协议,发送方只需要将数据包发送给接收方的IP地址和端口号,不需要建立连接。
  • UDP不提供可靠性,因为它不保证数据包的传输顺序和到达率。这意味着在通信过程中可能会丢失或重复数据包。
  • UDP的优势在于速度和开销较小,适用于实时性要求高的应用,如视频、音频流传输和游戏等。
UDP Server的实现
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int socket_fd, n;
    struct sockaddr_in server_addr, client_addr;
    char buffer[BUFFER_SIZE];

    // 创建UDP套接字
    socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (socket_fd < 0) {
        perror("Failed to create socket");
        exit(EXIT_FAILURE);
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = INADDR_ANY;

    // 绑定服务器地址和端口
    if (bind(socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Failed to bind server address");
        exit(EXIT_FAILURE);
    }

    while (1) {
        socklen_t client_len = sizeof(client_addr);

        // 接收来自客户端的数据
        n = recvfrom(socket_fd, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &client_len);

        // 处理接收到的数据
        printf("Received from client: %s\n", buffer);

        // 向客户端发送响应
        sendto(socket_fd, "Hello from server", strlen("Hello from server"), 0, (struct sockaddr*)&client_addr, client_len);
    }

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

    return 0;
}

上述代码中,我们先创建了一个UDP套接字(socket_fd = socket(AF_INET, SOCK_DGRAM, 0)),然后绑定服务器的地址和端口(bind(socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)))。接着,我们通过循环来不断接收来自客户端的数据包,处理并向客户端发送响应。

UDP Client的实现
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int socket_fd, n;
    struct sockaddr_in server_addr;
    char buffer[BUFFER_SIZE];

    // 创建UDP套接字
    socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (socket_fd < 0) {
        perror("Failed to create socket");
        exit(EXIT_FAILURE);
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = INADDR_ANY;

    while (1) {
        printf("Enter message: ");
        scanf("%s", buffer);

        // 向服务器发送数据
        sendto(socket_fd, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));

        // 接收服务器的响应
        n = recvfrom(socket_fd, buffer, sizeof(buffer), 0, NULL, NULL);
        buffer[n] = '\0';

        // 处理接收到的响应
        printf("Received from server: %s\n", buffer);
    }

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

    return 0;
}

上述代码中,我们创建了一个UDP套接字,然后通过循环不断向服务器发送数据,并接收服务器的响应。可以通过输入消息来测试客户端和服务器之间的通信。

总结

通过上述的代码实现,我们可以在C语言中使用UDP协议实现服务器和客户端之间的通信。UDP协议以其速度快、开销小的特点,适用于一些对可靠性要求不高但实时性要求较高的应用场景。请根据实际需求,在现有代码的基础上进行适当的修改和扩展。