来自“错误”IP的数据报

时间:2010-09-07 11:58:59

标签: java networking

我有一个带有虚拟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.220 212.179.158.221 的消息,但是当它响应时,响应始终被视为来自 212.179。 158.220 ,而我希望响应的远程地址反映收到原始邮件的IP。

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

所以,现在我已经解决了这个问题:有没有办法让响应消息的远程主机与原始消息的主机相同?我不希望它是自动的,因为套接字如何知道将此响应与该消息连接?但也许有办法强迫它?

提前致谢。

迈克尔

1 个答案:

答案 0 :(得分:0)

如果设置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()为响应提供相同的控制消息,并将原始目标地址用作源。