【发布时间】:2011-03-30 08:32:14
【问题描述】:
我想通过 unix 中的 tcp 套接字发送一个字符数组。
我的第一个想法是使用一个普通的 char 数组作为将通过套接字发送的结构:
typedef struct __attribute__((packed))
{
uint8_t type;
uint8_t id_index;
char char_value[STR_MSG_MAX];
} a_msg;
仅仅是因为 C 字符总是 8 位长。然而,经过一番谷歌搜索后,我发现即使一个 char 总是 8 位长,其底层表示实际上也可能是一个 32 位整数。所以我的印象是 char 可能不是在消息中表示字符串的最佳方式,该消息将通过套接字从 FreeBSd 发送到 Linux(或者如果你想输入一些其他 unixes =)...)。
stdint.h 存在于当今所有现代 unix 上(我希望如此),我的想法是,也许 uint8_t 或 int8_t 数组可以解决问题。
typedef struct __attribute__((packed))
{
uint8_t type;
uint8_t id_index;
uint8_t char_value[STR_MSG_MAX];
} a_msg;
或
typedef struct __attribute__((packed))
{
uint8_t type;
uint8_t id_index;
int8_t char_value[STR_MSG_MAX];
} a_msg;
但是,uint8_t 是无符号字符,而 int8_t 是有符号字符。标准的 C char 既不是这样,因为我理解的实现是未定义的。
我的问题是: 在 C 中表示字符数组(字符串)的最佳方式是什么,它将以 *nix(Linux、FreeBSD 等)平台无关的方式通过 tcp/ip 发送。
【问题讨论】:
-
发送字符串的最佳方式可能只是发送到
write原始字符串。我猜您想一次性发送您显示的结构,而不仅仅是字符数据?