在互联网上传输数值时,需要注意两点。
第一个是字节序,即字节(或有时位)出现的顺序。假设您有 32 位值 0xAABBCCDD。 Intel CPU 是 little-endian 机器,这意味着这些字节将存储为 { 0xDD, 0xCC, 0xBB, 0xAA }。换句话说,最低有效字节存储在最低地址。在大端机器中,字节将被存储为 { 0xAA, 0xBB, 0xCC, 0xDD },最低有效字节在最高地址。
在两台机器之间传输多字节整数时,您必须确保它们都正确解释彼此的数据,即使它们具有不同的字节顺序。值得庆幸的是,有一个称为网络字节顺序的标准,它是大端的,并且有 4 个有用的函数可以在主机顺序和网络顺序之间进行转换:
ntohl(网络到主机,长)
ntohs(网络到主机,简称)
htonl(主机到网络,长)
htons(主机到网络,简称)
长版本适用于 32 位整数,短版本适用于 16 位整数。只要你总是在通过网络传输数据之前调用 *hton** 并在从网络读取时调用 *ntoh** ,数据就会以正确的字节顺序排列。
当然,解决这个问题的最简单方法,尤其是因为您只有 20 个命令,是只使用单个字节,或 chars。
您必须处理的第二个问题是编码。有符号整数如何表示?使用符号位?二进制补码?同样,当网络上的不同平台使用不同的表示时,您会遇到问题。如果你坚持使用无符号类型,你应该不会有问题。
您在程序中使用什么来表示您的命令完全取决于您。只需确保您定义好协议并在传输和读取数据时遵守该协议即可。
例如:
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() { ... }