java - 来自 "wrong"IP 的数据报

标签 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

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

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

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

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

提前致谢。

迈克尔

最佳答案

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

关于java - 来自 "wrong"IP 的数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3658434/

相关文章:

java - Android Studio App播放声音

java - 依赖 "test"范围是否适用于 Maven 中的 "integration-test"阶段?

c - 在linux中如何知道从C中设置IP地址是成功还是失败

java - InetAddress 类中的 isReachable 问题

c - 如何创建在多个接口(interface)上发送/接收 UDP 广播的服务

java - apacheDS 无法创建新条目

java - XPath 从某个元素之后的元素获取文本

java - 在 libgdx 中将纹理分割成拼图

networking - 如何从延迟和带宽计算数据包时间

docker - Docker:如何从Docker内部连接到本地可用的服务器