轻松上手UDP编程:C语言实现网络数据收发全攻略

2026-07-06 0 阅读

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输层协议,它提供了比TCP(传输控制协议)更简单的网络通信方式。UDP常用于需要高速传输、但不要求可靠性的应用场景,如实时视频、音频传输等。本文将带你轻松上手UDP编程,使用C语言实现网络数据的收发。

1. UDP编程基础

1.1 UDP协议特点

  • 无连接:UDP不需要建立连接,发送数据前不需要进行握手。
  • 无错误检测:UDP不提供错误检测和纠正机制。
  • 速度快:由于不需要建立连接,UDP传输速度较快。

1.2 UDP数据结构

UDP数据结构包括源端口、目的端口、数据长度和数据本身。

struct sockaddr_in {
    uint16_t sin_family;  // 地址族,IPv4为AF_INET
    uint16_t sin_port;    // 端口号
    struct in_addr sin_addr;  // IP地址
    unsigned char sin_zero[8];  // 保留字段
};

2. C语言实现UDP通信

2.1 创建UDP套接字

使用socket函数创建UDP套接字。

int sock = socket(AF_INET, SOCK_DGRAM, 0);

2.2 绑定套接字

使用bind函数将套接字绑定到本地IP地址和端口号。

struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(12345);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));

2.3 发送数据

使用sendto函数发送数据。

char buffer[1024];
strcpy(buffer, "Hello, UDP!");
sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));

2.4 接收数据

使用recvfrom函数接收数据。

struct sockaddr_in client_addr;
int len = sizeof(client_addr);
char buffer[1024];
recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &len);
printf("Received: %s\n", buffer);

2.5 关闭套接字

使用close函数关闭套接字。

close(sock);

3. 实战案例

以下是一个简单的UDP服务器和客户端示例:

服务器端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in server_addr, client_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(12345);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));

    char buffer[1024];
    int len = sizeof(client_addr);
    while (1) {
        recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &len);
        printf("Received: %s\n", buffer);
        strcpy(buffer, "Hello, Client!");
        sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr *)&client_addr, len);
    }

    close(sock);
    return 0;
}

客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(12345);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    char buffer[1024];
    strcpy(buffer, "Hello, Server!");
    sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));

    int len = sizeof(server_addr);
    recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&server_addr, &len);
    printf("Received: %s\n", buffer);

    close(sock);
    return 0;
}

编译并运行服务器端和客户端程序,你将看到它们之间的通信过程。

4. 总结

本文介绍了UDP编程的基础知识和C语言实现网络数据收发的全过程。通过本文的学习,相信你已经能够轻松上手UDP编程,并在实际项目中应用。

分享到: