我正在使用Enea OSE这个实时嵌入式操作系统的项目。我想你们中许多人对这个操作系统并不熟悉,但我认为你可以回答我的问题。我想在两张卡之间使用接口“eth1”发送一个原始以太网帧,这些接口直接通过以太网电缆连接到另一个卡(无交换机或任何其他设备)。 “eth1”接口未分配任何IP地址。如何使用sendto通过原始以太网套接字发送数据而不使用sockaddr_ll?
我可以简单地宣布用
int s = socket(AF_INET, RAW_SOCKET, ...)
一个插座,然后我可以使用绑定套接字到相应的设备接口:
setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, "eth1", 4);
什么我的计划是这样做,才能发送数据从一张卡到另一张卡,手动到用源和目标MAC地址填充以太网缓冲区阵列。
sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
在这些例子中我已经在互联网上使用发现:然后使用的sendto(....)
然而SENDTO程序也需要 SOCKADDR结构与信息发送数据sockaddr_in当ip地址是已知的和 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
};
我也尝试过在调用sendto()时使用NULL作为sockaddr字段,发送失败。这使我想到了我的问题。我可以使用简单的sockaddr结构填充目标MAC地址而不使用任何IP?那看起来怎么样? (我还没有看到任何代码显示这个)。为什么我们甚至不得不提供一个sockaddr结构?以太网数据缓冲区是否已经包含这些信息?最后,我试图完成甚至可能没有为网络设备分配IP地址?
我知道什么,我试图做的似乎奇怪,但有它的一个原因:)我会很高兴,如果你会告诉我如何做到这一点,而无需使用 sockaddr_ll结构。
我找不到库中的头文件。这是Enea OSE5.6,或许它不包含在这个版本中?我也无法在OSE应用程序编程手册中找到它。那么我可以使用简单的sockaddr结构体还是必须使用sockaddr_ll? –
Euklides
'struct sockaddr'只是一个通用的占位符。不管你输入什么,它都必须由套接字协议栈进行解释。所以如果你的内核实现了原始/数据报以太网通信,那么必须有一个头部来定义地址族AF_ *',该协议和合适的结构来保存协议控制信息。 –