0

我遇到了在接收来自 python 客户端的请求的 C tcp 套接字服务器中读取字节的问题。我有以下结构作为我的接收模板

struct ofp_connect {
uint16_t wildcards;                /* identifies ports to use below */
uint16_t num_components;           

uint8_t  pad[4];                   /* Align to 64 bits */

uint16_t in_port[0];               
uint16_t out_port[0];           

struct ofp_tdm_port in_tport[0];   
struct ofp_tdm_port out_tport[0];

struct ofp_wave_port in_wport[0];  
struct ofp_wave_port out_wport[0];

};
OFP_ASSERT(sizeof(struct ofp_connect) == 8);

我可以正确读取前两个 32 位字段,但我的问题是填充字段之后的 in_port[0] 似乎是错误的。目前阅读的方式是

uint16_t portwin, portwout, * wportIN;
wportIN =  (uint16_t*)&cflow_mod->connect.in_port; //where cflow_mod is the main struct which encompasses connect struct template described above 
memcpy(&portwin, wportIN, sizeof(portwin) );
DBG("inport:%d:\n", ntohs(portwin));

不幸的是,这并没有给我预期的输入端口号。我可以在wireshark中检查客户端正在发送正确的数据包格式,但我觉得我读取输入/输出端口的方式是错误的。还是因为 python 发送数据的方式?你能就我哪里出错以及为什么出错提供一些建议吗?提前致谢。

4

1 回答 1

1

struct ofp_connect 的声明违反了 ISO C 标准的以下条款:

6.7.2.1 结构和联合说明符... 18 作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。

请注意,在您的情况下in_portout_port应该声明为in_port[]out_port[]利用上述条款,在这种情况下,您将拥有两个灵活的数组成员,这是上述条款所禁止的。零长度数组声明是许多编译器(例如包括 gcc)采用的约定,它具有相同的语义,但在您的情况下,两者in_port共享out_port 相同的空间(基本上是ofp_connect结构后面的任何字节)。此外,为此,您必须在结构之后为灵活数组成员分配一些空间。正如您所说,因为struct connect是更大结构的一部分,所以访问in_port返回存储在包含结构的成员中的“值”connectstruct

于 2013-08-19T02:52:04.437 回答