如何使用sendto通过原始以太网套接字发送数据而不使用sockaddr_ll?

 waxw 发布于 2023-01-30 18:43

我正在开发一个项目,我们使用Enea OSE,这是一个实时嵌入式操作系统.我猜你们很多人都不熟悉这个操作系统,但我认为无论如何你都可以回答我的问题.我想使用接口"eth1"在2张卡之间发送原始以太网帧,这些接口通过以太网电缆(无交换机或任何东西)直接连接到另一个."eth1"接口未分配任何IP地址.

我可以简单地使用socket声明一个套接字

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);

在我已经在互联网上找到的例子中使用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
};

我也尝试使用NULL,当调用sendto()时,对于sockaddr字段,发送失败.这让我想到了我的问题.我可以使用简单的sockaddr结构来填充目标MAC地址而不使用任何IP吗?那怎么样?(我没有看到任何显示此代码的代码).为什么我们甚至必须提供sockaddr结构?以太网数据缓冲区是否已包含此信息?最后,如果没有为网络设备分配IP地址,我是否正在努力实现?

我知道我想要做的事情看起来很奇怪,但有一个原因吧:)如果你能告诉我如何在不使用sockaddr_ll结构的情况下完成这项工作,我会很高兴的.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有