【问题标题】:Datagram coming from the "wrong" IP来自“错误”IP 的数据报
【发布时间】:2010-09-07 11:58:58
【问题描述】:

我有一个设置了虚拟 IP 的 Linux 机器。这是ip addr的部分输出:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether e4:1f:13:60:10:34 brd ff:ff:ff:ff:ff:ff
    inet 212.179.158.220/25 brd 212.179.158.255 scope global eth0
    inet 212.179.158.221/32 scope global eth0
    inet6 fe80::e61f:13ff:fe60:1034/64 scope link
       valid_lft forever preferred_lft forever

在这台机器上,我创建了一个绑定到 new InetSocketAddress(port) 的 DatagramSocket,它应该绑定到通配符 IP。

然后应用程序接收发送到 212.179.158.220212.179.158.221 的消息,但是当它响应时,响应始终被视为来自 212.179。 158.220,而我希望响应的远程地址反映收到原始消息的 IP。

我可以为每个 IP 创建一个套接字并监听两者;这给了我想要的行为,但这意味着如果虚拟 IP 在应用程序运行时出现,它将忽略发送到 VIP 的消息。

所以,既然我已经说明了这一点:有没有办法让响应消息的远程主机与原始消息进入的主机相同?我不希望它是自动的,因为套接字应该如何知道将此响应与该消息连接起来?但也许有办法强制它?

提前致谢。

迈克尔

【问题讨论】:

    标签: java networking


    【解决方案1】:

    如果设置IP_PKTINFO 套接字选项,则使用recvmsg() 接收数据报并提供msg_control 缓冲区,接收到的数据报将包含IP_PKTINFO 控制消息,其中包含struct in_pktinfo 结构:

    struct in_pktinfo {
        unsigned int   ipi_ifindex;  /* Interface index */
        struct in_addr ipi_spec_dst; /* Local address */
        struct in_addr ipi_addr;     /* Header Destination address */
    };
    

    此控制消息告诉您本地目标地址。然后,您可以使用sendmsg() 在响应中提供相同的控制消息,原始目标地址将用作源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-18
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      相关资源
      最近更新 更多