为什么DatagramPacket的源端口不持久?

时间:2016-01-03 09:21:11

标签: java android sockets datagram

我有一个线程,它使用以下设置定期发送数据报包:

DatagramSocket mySocket;
try {
    mySocket =  = new DatagramSocket(9999);
    mySocket.connect(new InetSocketAddress(dstAddress, dstPort));
} catch (SocketException e) {
    e.printStackTrace();
    return;[![enter image description here][1]][1]
}

byte[] sentPacketBuffer = new byte[1];
DatagramPacket sentPacket = new DatagramPacket(sentPacketBuffer, sentPacketBuffer.length);

对于send方法的每次调用:

mySocket.send(sentPacket);

我在接收方获得了不同的source port

我查看this question,但答案实际上与为侦听器端设置源端口有关。

有没有办法让源端口(发件人)持久?

修改

我使用Android的VPNService捕获收到的数据包,然后将它们转发给Wireshark:

正如您所看到的,只有1个数据包具有正确的源端口。

然后我发现它可能与目标IP有关。无法从此设备访问目标IP。

如果我确实可以使这个地址可达(通过连接到192.168.49.1,并且在同一子网中有一个接口),我将获得所有数据包的正确源端口:enter image description here

所以,我现在的问题是为什么目标可达性(或可用接口)与源端口相关?

1 个答案:

答案 0 :(得分:0)

你错了。此代码发送的数据报的源端口始终为9999。

NB继续使用相同的套接字。每个数据报创建和销毁一个新数据报毫无意义。