MST

星途 面试题库

面试题:C语言网络字节序转换在UDP编程中的应用

假设你正在使用C语言编写一个UDP网络程序,需要在客户端和服务器之间传输自定义的结构体数据。结构体中包含不同类型的数据成员,如整数、短整数等。请描述如何正确地处理这些数据成员的字节序转换,以确保在不同主机环境下数据的一致性,并给出关键代码示例。
17.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

字节序转换处理

在不同主机环境下,数据存储的字节序可能不同,主要有大端序(Big-Endian)和小端序(Little-Endian)。为确保数据一致性,需要进行字节序转换。在UDP网络程序中,通常使用网络字节序(大端序)进行数据传输。

对于整数类型,C 标准库提供了 htons(主机字节序转网络字节序,适用于短整数)、htonl(主机字节序转网络字节序,适用于长整数)、ntohs(网络字节序转主机字节序,适用于短整数)和 ntohl(网络字节序转主机字节序,适用于长整数)函数。

关键代码示例

#include <stdio.h>
#include <arpa/inet.h>  // 包含字节序转换函数头文件
#include <string.h>

// 定义自定义结构体
typedef struct {
    short int num1;
    int num2;
} CustomStruct;

// 发送端(客户端)
void send_data(int sockfd, const struct sockaddr *dest_addr, socklen_t addrlen) {
    CustomStruct data;
    data.num1 = 1234;
    data.num2 = 567890;

    // 字节序转换
    data.num1 = htons(data.num1);
    data.num2 = htonl(data.num2);

    sendto(sockfd, &data, sizeof(CustomStruct), 0, dest_addr, addrlen);
}

// 接收端(服务器)
void receive_data(int sockfd) {
    CustomStruct data;
    socklen_t addrlen;
    struct sockaddr_storage src_addr;
    recvfrom(sockfd, &data, sizeof(CustomStruct), 0, (struct sockaddr *)&src_addr, &addrlen);

    // 字节序转换
    data.num1 = ntohs(data.num1);
    data.num2 = ntohl(data.num2);

    printf("Received data: num1 = %d, num2 = %d\n", data.num1, data.num2);
}

在上述代码中,发送端使用 htonshtonl 函数将结构体中的数据成员转换为网络字节序,接收端使用 ntohsntohl 函数将接收到的数据转换为主机字节序,以此确保在不同主机环境下数据的一致性。