使用绑定到通配符地址的DatagramSocket时如何处理不正确的源地址?

时间:2015-08-28 21:29:59

标签: java sockets udp ipv6

我有一个DatagramSocket绑定到“ANY”通配符地址的服务器(使用DatagramSocket(int)构造函数)。这个单一套接字允许服务器监听多个地址上的UDP消息,特别是IPv4和IPv6。

不幸的是,在发送响应时,服务器并不总是选择客户端发送请求的相同地址作为源地址;结果是ICMPv6消息目标无法到达,无法访问端口。

同一服务器也绑定到TCP的通配符地址,并且从不会出现TCP的错误源地址问题。 This Linux/C question似乎是同一个问题,一个回答者提到特殊处理“TCP不需要,因为它透明地处理多宿主”。

除了为每个地址绑定一个单独的DatagramSocket之外,有没有办法在Java中解决这个问题?

2 个答案:

答案 0 :(得分:0)

DatagramSocket的api说JVM必须匹配操作系统。此外,缓冲区大小必须足够大,以便排队所有端口。

答案 1 :(得分:0)

除了多个DatagramSockets之外,另一个解决方案是更改客户端代码以侦听来自任何地址的数据包,并在数据包有效负载中包含来自服务器的任何必要的识别信息。

但是,我认为每个服务器IP地址有一个DatagramSocket是一个更好的解决方案。使用TCP会更好,因为它听起来像你想要一个双向的,面向连接的对话,这就是TCP的设计目的。