c - 如何实现以太网调制解调器

标签 c network-programming ethernet raw-ethernet

好吧,作为训练练习,我想做的是实现这样的事情

客户端 --ethernet--> 调制解调器1 --GPIO--> 调制解调器2 --ethernet--> 我的家路由器

客户端使用以太网电缆连接到调制解调器1。
Modem1 是 Raberry PI,转换信号并通过 GPIO 中继
Modem2是Raberry PI,从GPIO接收数据,并通过以太网线将其发送到我的家庭路由器

我想实现调制解调器,但不知道从哪里开始。

我已经阅读了一些有关以太网编程的内容,但仍然找不到“简单的东西”之类的答案。

  1. 如何实现Modem1,以便当它连接到客户端时,客户端将其发现为互联网连接。

  2. 在Modem2端,如何让“我的家庭路由器”将发往“客户端”的数据包发送到Modem2,以便Modem2转发它们。

可能还有我没有想到的事情......

那么,具体来说,我该如何实现呢?最好在 c 中。

最佳答案

我敢说您也许能够编写某种自定义 GPIO 中间层。

读以太网->封装->写GPIO->|->读GPIO->解封装->写以太网

(反之亦然)

问题就变成了:两个调制解调器如何充当“以太网代理”?

Modem1 充当路由器的代理。 Modem2 充当客户端的代理。如果您的 Raspberry Pi 可以欺骗 MAC 地址,您也许能够欺骗以太网对等点与调制解调器的以太网端口进行通信。之所以需要欺骗 MAC 地址,是因为在 TCP/IP 网络中,存在 ARP 表,它将远程 IP 地址映射到可以将 IP 数据包路由到远程 IP 地址或从远程 IP 地址路由到远程 IP 地址的 MAC 地址。这使得您的客户端能够通过 TCP/IP 与您的路由器进行通信。

另一个潜在的陷阱是调制解调器通信会引入延迟,从而干扰以太网层对协议(protocol)的处理。例如,以太网协议(protocol)可能具有实时约束,如果引入延迟,这些约束可能会被打破......

但是让我们假设在完美的世界中一切皆有可能......

您需要编写用于读取/写入以太网消息的代码(我见过用于在 Linux 中通过原始套接字读取/写入以太网数据包的开源代码)

您需要为 GPIO 通信编写自定义驱动程序。 这意味着实现一个经过深思熟虑的协议(protocol)来管理引脚状态、消息开始、消息结束、数据有效负载、校验和等等......

最后,您需要编写一个顶层通信层来实现:

以太网到 GPIO 流程:

a) 从以太网端口读取,将以太网数据包封装成自定义消息(或消息片段)

b) 使用自定义 GPIO 协议(protocol)驱动程序将此自定义消息传达给外部 GPIO 对等

GPIO 转以太网流程:

a) 使用您的自定义驱动程序代码从 GPIO 读取 b) 解封装以太网数据包 c) 将以太网数据包写入以太网端口。

这两个进程永远运行...

同样,一切都取决于您的调制解调器是否可以将自己插入点对点连接而不干扰以太网协议(protocol)的自然流程......

至于“C”部分...

如果您使用开源库(或代码片段)通过原始套接字读取/写入原始以太网,那么很可能是用 C 编写的。

您的 GPIO 代码将以两种方式之一从 GPIO 引脚进行读写:从内存映射的 H/W 地址,或使用该 H/W 地址上的 ioport 调用。

Receive raw Ethernet frames in Linux

Send a raw Ethernet frame in Linux

祝你好运

关于c - 如何实现以太网调制解调器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30538140/

相关文章:

c - C 中字符串的 printf 的意外输出

c - 意外行为,在字符串后打印垃圾

c - 第一个 tcp echo 客户端无法与第二个 tcp echo 客户端通信(文件描述符错误)

ios - 有没有办法检测 USB 以太网适配器是否以编程方式连接到 iPhone/iPad?

c# - Windows (xp) 中使用 C# 或 C 进行以太网帧或 MAC 广播

c++ - 使用 Arduino 上的 atoi 和 itoa 从 int 转换为字节数组然后返回 int 进行传输

c - Linux 上的 Termios.h 错误,Windows 上的 -lftdi 错误。交叉编译

c - struct msghdr 的 msg_name 不指向 linux 安全模块的 socket_recvmsg 中的 struct sockaddr_in

network-programming - 分布式系统和网络操作系统(理论)

python - 带有 OpenCV/python 的 Prosilica GigE 相机