gpt4 book ai didi

c - 我应该对网络命令使用#defines 还是枚举?

转载 作者:太空宇宙 更新时间:2023-11-04 05:47:06 27 4
gpt4 key购买 nike

我必须传输一些值以用作网络上的命令,我希望它尽可能高效和健壮,即我需要关于这些命令的用途的意见, #defines 还是枚举?

命令范围不得超过 20 个命令(假设每个定义的命令响应为 40 个),因此根据我所听到的大多数情况,它很适合字符限制。

到目前为止,我假设最好的方法是使用枚举。

最佳答案

在互联网上传输数值时,您需要牢记两点。

首先是字节顺序,即字节(有时是位)出现的顺序。假设您有 32 位值 0xAABBCCDD。 Intel CPU 是小端机器,这意味着这些字节将存储为 { 0xDD, 0xCC, 0xBB, 0xAA }。换句话说,最低有效字节存储在最低地址。在大端机器中,字节将存储为 { 0xAA, 0xBB, 0xCC, 0xDD },最低有效字节位于最高地址。

在两台机器之间传输多字节整数时,您必须确保它们都能正确解释彼此的数据,即使它们的字节顺序不同。值得庆幸的是,有一个称为网络字节顺序的标准,它是 big-endian,并且有 4 个有用的函数可以在主机顺序和网络顺序之间进行转换:

ntohl (Network to Host, long)
ntohs (Network to host, short)
htonl (Host to network, long)
htons (Host to network, short)

长版本使用 32 位整数,短版本使用 16 位整数。只要您总是在通过网络传输数据之前调用 *hton** 并在从网络读取数据时调用 *ntoh** ,数据就会以正确的字节顺序排列。

当然,解决此问题的最简单方法,尤其是因为您只有 20 个命令,就是只使用单个字节或 char

您必须处理的第二个问题是编码。有符号整数是如何表示的?使用符号位?补码?同样,当网络上的不同平台使用不同的表示时,您会遇到问题。如果您坚持使用无符号类型,那么您真的应该没有问题。

在程序中使用什么来表示命令完全取决于您。只需确保您定义好协议(protocol)并在传输和读取数据时遵守该协议(protocol)即可。

例如:

enum command_t { one, two, three }

void send_command(command_t c) {
send((unsigned char)c);
}

command_t read_command() {
return (command_t)recv();
}

void send(unsigned char c) { ... }
unsigned char recv() { ... }

关于c - 我应该对网络命令使用#defines 还是枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1113943/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com