在我的应用程序中,我使用以下指令打开一个原始套接字(LINUX 内核 3.8.5):
::socket( PF_PACKET, SOCK_RAW, htons((uint16_t)ETH_P_ALL));
一切正常,我能够接收它并将其发送到另一个接口。然而有一段时间
::recvfrom()
在那个套接字上返回 1518(1504 个有效负载字节 + 14 个 ETH_HLEN)。
当我尝试发送这个 1518 字节的缓冲区时,但是指令
::send(......)
返回 EMSGSIZE(消息太长)。
请注意,在我的 NIC 接口上,MTU 为 1500,因此我预计使用 ::recvfrom 检索的最多 1514(有效负载 + ETH_HLEN)字节
ethtype 是 0x0800 所以它不是 vlan 标记的帧,因此这 4 个字节“额外”不是由于 vlan 标记
你有解释吗?