c - 以太网环回测试

标签 c linux sockets ethernet

我正在尝试创建一个测试来验证 PHY 环回是否正常工作。在 linux 上用 c 开发。这基本上就是测试当前正在做的事情:

  1. 调出界面并确保它具有有效的 IP 地址
  2. 创建两个 UDP 模式的套接字 (SOCK_DGRAM)
  3. 将两个套接字绑定(bind)到正在测试的特定接口(interface)
  4. 将传入套接字绑定(bind)到特定端口
  5. 使用 sendto 写入传出套接字,指定端口和 IP 地址
  6. 从传入套接字读取

我遇到的问题是,无论是否启用环回,我总是在读回数据。该接口(interface)未连接到交换机,因此我不希望数据通过物理电缆返回。我怀疑堆栈在数据到达 PHY 之前就将数据路由回去。有什么方法可以确保数据包物理地从接口(interface)发出?

最佳答案

正如您可能已经猜到的那样,这不是错误,而是一项功能(也是一项基本功能)。但是,我怀疑您是否能够在没有第二个接收器的情况下测试 PHY。

案例 #1:NIC 将数据发送到集线器(这些集线器还存在吗?)。集线器只会放大信号。没有人会就信号向 NIC 顶嘴。 NIC 在发送信号时没有兴趣读取自己的信号。

案例 #2:NIC 将数据发送到交换机。交换机将在其路由中自动永远不会将信号发送回源。这样做没有意义,并且在某些情况下(例如广播包)会导致网络出现严重问题。

案例 #3:您有一个复杂的网络设置,其中可能存在环路。要么你的网络出了问题,要么你使用生成树之类的技术来明确阻止你的信号被路由回你。

如您所见,内部数据路由必不可少。您没有机会通过一个物理以太网接口(interface)发送内容并在同一端接收它。

关于c - 以太网环回测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16108118/

相关文章:

c - C语言中的kill命令

linux - 模拟有读取错误的故障 block 设备?

linux - 如何使用 C++ 代码中的 setsockopt() 调用更改 TCP 拥塞控制算法

Java(网络):passing incremented values between client and server

Java 多个 SSL 客户端到一台服务器

c - 如何删除字符串中的元音

c - 在C中打开并写入多个文件

无法弄清楚为什么程序在 C 中崩溃

linux - 如何在文本中搜索多行模式并获得最后一次出现?

c - C 程序将标准输出的小写字母转换为大写字母的小问题