【发布时间】:2012-01-26 20:29:26
【问题描述】:
我正在尝试填充结构内的一个字段,但对如何执行此操作有点困惑: 以下是结构:
struct ofp_packet_out {
struct ofp_header header;
uint32_t buffer_id; /* ID assigned by datapath (-1 if none). */
uint16_t in_port; /* Packet's input port (OFPP_NONE if none). */
uint16_t actions_len; /* Size of action array in bytes. */
struct ofp_action_header actions[0]; /* Actions. */
uint8_t data[0]; /* Packet data. The length is inferred
from the length field in the header.
(Only meaningful if buffer_id == -1.) */
};
OFP_ASSERT(sizeof(struct ofp_packet_out) == 16);
我要填写的字段是 uint8_t data[0]。这将是一个 char 数组,假设 我们有一个缓冲区
char * buf[150]={some data};
p_action_header actions[0]的字段结构体;是一个动作数组,可以用来追加多个动作,一个例子是
typedef struct ofp_action_output ofp_action_output;
ofp_action_output action = *((ofp_action_output*)ofm.actions);
memset(&action, 0, sizeof(ofp_action_output));
action.type = htons(OFPAT_OUTPUT);
action.len = htons(sizeof(ofp_action_output));
action.port = htons(OFPP_FLOOD);
action.max_len = htons(0);
其中 ofm 是 struct some_struct ofm;,其中包含字段操作。
我正在努力的是如何在 uint8_t data[0]; 领域做同样的事情
正如我所提到的,我将所需的数据提取到一个数组中,我需要将这些数据放入
到struct字段uint8_t data[0];这样我从交换机收到的数据可以发回给它。
如何将其附加到必填字段?所有帮助将不胜感激。 谢谢。
【问题讨论】:
-
您想要 C 答案还是 C++ 答案?不要标记两种语言。
-
撇开零长度数组的智慧和可移植性不谈,你不能拥有多个数组;只有结构中的最后一个元素是零长度数组才有意义。
-
我更喜欢 C 答案。事实上,该结构实际上是网络交换机中内置的 OPENFLOW 规范的实现。当交换机无法缓冲数据包数据时,它会将其发送到我们的程序(整个数据。),我将数据存储在我提到的 char 数组中,现在我需要将该数据附加到字段中,如您所见我们可以通过在标头长度字段中指定大小来将所谓的零大小数据数组的大小设置为我们想要的任何值。
-
您可能还想将
attribute((packed))添加到结构的声明中,以防止 gcc 插入额外的填充字节以实现最佳成员对齐。当然,这仅在您想将指向该结构的指针直接传递给 read() 或 write() 之类的函数时才有效。
标签: c