【问题标题】:How to set source address when sending using and UDP socket使用和UDP套接字发送时如何设置源地址
【发布时间】:2011-08-10 22:44:19
【问题描述】:

我有两台电脑使用 VRRP 进行冗余。因此,每台 PC (Linux) 都有一个物理 IP 地址和一个虚拟 IP 地址。

我有一个带有 UDP 协议的客户端/服务器架构的软件 (C++)。软件将监听套接字绑定在“0.0.0.0”上,每次需要向对方发送一些数据时使用一个新的套接字。使用wireshark,我看到当它发送数据时,源IP是物理IP... 如何将发送套接字的源地址设置为虚拟的??

注意:使用 ifconfig 我只看到带有物理地址的 eth0...

【问题讨论】:

  • 你的意思是在同一个物理网卡上有两个ip地址?如果是这样,那就是“虚拟适配器”而不是虚拟 IP 地址。您可能只需要绑定到正确的地址并忽略它是否是虚拟的。

标签: c++ linux sockets udp


【解决方案1】:

当内核需要通过套接字发送一些东西时,它会执行这些步骤

  • 如果套接字已绑定,则使用该源地址
  • 是套接字没有绑定,它四处寻找接口并选择一个源地址

所以你需要bind(2)你的socket到你想要的地址。欲了解更多信息:"Source Address Selection" in chapter "IP Routing" of "Guide to IP Layer Network Administration with Linux"

【讨论】:

    【解决方案2】:

    我不确定我是否完全理解您的问题,但就在 linux 上以低级别编写 C/C++ 代码而言,您可以从 linux 内核头文件中导入 ip.h 头文件,这使您可以访问低级别IP 数据包结构。 (UDP 工作在 IP 之上)

    #include <linux/ip.h>
    

    然后查看struct iphdr,它是发送的每个 IP 数据包的标头,其中包含一个 saddr 成员,您可以通过编程将其设置为源地址。

    【讨论】:

    • 好的,我试着解释得更好。我有一个物理地址和一个虚拟地址(不使用 ifconfig 显示)具有相同的网络掩码。当我通过 UDP 套接字(没有绑定但只连接)发送数据时,我希望源地址是虚拟 IP,而使用实际代码(打开套接字并发送数据的标准代码)源地址是物理地址一。我希望我没有降到这么低级的代码...... :-)
    • 如我所说,您可以按照我描述的方式将源地址设置为虚拟ip。
    • 我觉得这个答案太抽象了。一些示例代码会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 2011-03-04
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2012-11-12
    相关资源
    最近更新 更多