【发布时间】:2014-02-20 02:54:08
【问题描述】:
我正在开展一个使用 Enea OSE 的项目,它是一个实时嵌入式操作系统。我想你们中的许多人都不熟悉这个操作系统,但我认为无论如何你都可以回答我的问题。我想使用接口“eth1”在 2 个卡之间发送一个原始以太网帧,这些接口通过以太网电缆(没有开关或任何东西)直接连接到另一个。 “eth1”接口没有分配任何IP地址。
我可以简单地使用
声明一个套接字int s = socket(AF_INET, RAW_SOCKET, ...)
然后我可以使用以下方法将套接字绑定到适当的设备接口:
setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, "eth1", 4);
为了将数据从一张卡发送到另一张卡,我的计划是手动用源和目标 MAC 地址填充以太网缓冲区阵列。然后使用 sendto(....) 发送数据
但是 sendto 例程还需要一个带有信息的 sockaddr 结构:
sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
在我在互联网上找到的示例中,当 IP 地址已知时使用 sockaddr_in,而对于原始帧使用 sockaddr_ll。但是 OSE 不提供 sockaddr_ll 结构。但是它提供了 sockaddr ,我不知道我是否可以将其用于原始以太网帧?
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
我也尝试使用NULL,sockaddr字段在调用sendto()时,发送失败。这让我想到了我的问题。我可以使用简单的 sockaddr 结构来填写目标 MAC 地址而不使用任何 IP 吗?那看起来怎么样? (我还没有看到任何显示这一点的代码)。为什么我们甚至必须提供一个 sockaddr 结构?以太网数据缓冲区不是已经包含这些信息了吗?最后,在不为网络设备分配 IP 地址的情况下,我想要实现的目标是否可行?
我知道我正在尝试做的事情看起来很奇怪,但这是有原因的 :) 如果您能告诉我如何在不使用 sockaddr_ll的情况下完成此操作,我将非常高兴> 结构。
【问题讨论】: