【问题标题】:Is there a way to to set a socket option to indicate which interface the packets go to有没有办法设置一个套接字选项来指示数据包去哪个接口
【发布时间】:2013-05-22 03:26:43
【问题描述】:

目前,这是我的困境。 我有 2 个 fd:x 和 y。当 write(x) 发生时,它必须去 x-tunnel,而 write(y) 应该去 y-tunnel。我无法为每个连接创建路由规则(此处未提及原因)

当我接受连接时,我可以设置一个 sock opt 还是有其他方法可以做到这一点?

谢谢

【问题讨论】:

  • 您是否尝试将套接字绑定到连接到您要使用的路由的接口?
  • 接口是虚拟的,无法绑定,因为单个连接可以写入 x 和 y 接口
  • 在实践中,这意味着用户(系统管理员)需要一种方法来指定最终发送到 bind 的 IP 地址。然后管理员必须以某种方式为她想要使用的接口指定正确的地址。在你的特殊情况下,她需要能够为 X 和 Y 执行一次。
  • 一个物理接口有2个虚拟接口。绑定它将最终从物理上发送出去。但是分类需要在虚拟上进行。。我认为这不能通过绑定来完成。
  • 并且这两个虚拟接口应该有不同的IP地址,所以你可以绑定到这些地址。

标签: c unix network-programming


【解决方案1】:
  • 您可以在 x、y 隧道的特定接口上控制 sock 绑定
  • 检查 setsockopt 中的 SO_DONTROUTE 选项

【讨论】:

    【解决方案2】:

    您的描述很粗略,我认为 SO_REUSEADDR 和 SO_REUSEPORT 的 optname 的 setsockopt() 可能会对您有所帮助,但我不确定。它不能“指示”数据包到达哪个接口,但您可以通过以下方式指示它们你的工具。

    这里有一些关于Unix网络编程的参考资料,如果你想了解更多细节,你可以阅读7.5章的例子和例子。

    SO_REUSEADDR 套接字选项有四种不同的用途:

    1. SO_REUSEADDR 允许侦听服务器启动并绑定其众所周知的端口, 即使存在使用此端口作为本地端口的先前建立的连接 港口。
    2. SO_REUSEADDR 允许在与 与通配符地址绑定的现有服务器,只要每个实例 绑定不同的本地 IP 地址。
    3. SO_REUSEADDR 允许单个进程将同一个端口绑定到多个 套接字,只要每个绑定指定不同的本地 IP 地址。
    4. SO_REUSEADDR 允许完全重复的绑定:IP 地址的绑定 和端口,当相同的 IP 地址和端口已经绑定到另一个 套接字,如果传输协议支持它。通常支持此功能 仅适用于 UDP 套接字。

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 1970-01-01
      • 2018-07-07
      • 2021-03-18
      • 2010-10-14
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多