发送以太网数据包时额外填充?
Extra Padding while sending a ethernet packet?
我正在编写代码将数据包发送到另一个 mac 地址。我 ma 使用一个结构来创建一个数据包,如下所述:
typedef struct vlink_prm_in_s
{
vlink_header_t header;
uint32_t address;
uint16_t length;
}vlink_prm_in_t;
当我想发送数据包时,我执行以下步骤:
vlink_prm_in_t g_pkt;
g_pkt.header.verCmd = 0x43;
g_pkt.header.reverseVerCmd = ~(g_pkt.header.verCmd);
g_pkt.address = 0x11111111;
g_pkt.length = 0x2222;
memcpy(sendbuf+headerLen, &g_pkt, sizeof(g_pkt));
printf("%x\n", sendbuf[headerLen+4] );
payloadLen = sizeof(g_pkt);
sendbuf[headerLen+payloadLen] = 0xA5;
payloadLen++;
当我发送数据包时,我在 WireShark 中跟踪它时收到以下数据包:
aa bb cc dd ee 66 98 ee cb 03 是 1d ea e8 43 bc 00 00 11 11 11 11 22 22 00 00 a5
我不知道从哪里得到这些额外的零(突出显示)?谢谢
在网上看了更多之后,我发现结构应该是纯粹的递增或递减顺序(或者所有的变量应该是相同的大小)。这样您就可以删除多余的零。所以我做了如下:
typedef struct vlink_prm_in_s
{
vlink_header_t header;
uint16_t address1;
uint16_t address2;
uint16_t length;
}vlink_prm_in_t;
这解决了我的问题。
我正在编写代码将数据包发送到另一个 mac 地址。我 ma 使用一个结构来创建一个数据包,如下所述:
typedef struct vlink_prm_in_s
{
vlink_header_t header;
uint32_t address;
uint16_t length;
}vlink_prm_in_t;
当我想发送数据包时,我执行以下步骤:
vlink_prm_in_t g_pkt;
g_pkt.header.verCmd = 0x43;
g_pkt.header.reverseVerCmd = ~(g_pkt.header.verCmd);
g_pkt.address = 0x11111111;
g_pkt.length = 0x2222;
memcpy(sendbuf+headerLen, &g_pkt, sizeof(g_pkt));
printf("%x\n", sendbuf[headerLen+4] );
payloadLen = sizeof(g_pkt);
sendbuf[headerLen+payloadLen] = 0xA5;
payloadLen++;
当我发送数据包时,我在 WireShark 中跟踪它时收到以下数据包:
aa bb cc dd ee 66 98 ee cb 03 是 1d ea e8 43 bc 00 00 11 11 11 11 22 22 00 00 a5
我不知道从哪里得到这些额外的零(突出显示)?谢谢
在网上看了更多之后,我发现结构应该是纯粹的递增或递减顺序(或者所有的变量应该是相同的大小)。这样您就可以删除多余的零。所以我做了如下:
typedef struct vlink_prm_in_s
{
vlink_header_t header;
uint16_t address1;
uint16_t address2;
uint16_t length;
}vlink_prm_in_t;
这解决了我的问题。