java - 在 udp 套接字上设置源端口

标签 java sockets

我们开发了一个 Java 应用程序,它将多个 UDP 数据报发送到同一个目标 IP 地址。显然,目标端口始终是相同的,但我们似乎无法将源端口设置为在每个数据报上保持相同。
如果我们发送的数据包大于 MTU,则数据包会在同一源端口上正确拆分,但是一旦我们发送新的数据包,源端口就会发生变化,从而生成新的防火墙 session (网络管理员警告我们这是非常糟糕的)由于应用程序生成的 session 量)。

现在我们正在发送带有以下声明的包裹:

我们尝试了多种方法,结果总是一样,我们似乎无法将源端口设置为固定值。

编辑-粘贴实际代码:

private boolean sendImage(byte[] imageData, InetAddress address,
int port) throws UnknownHostException, SocketException {

    boolean ret = false;


    DatagramSocket socket = null;

    try {
        socket = new DatagramSocket();
        DatagramPacket dp = new DatagramPacket(imageData, imageData.length, address, PUERTO_UDP);
        socket.send(dp);
        ret = true;
    } catch (IOException e) {
        Main.lanzarExcepcion(e);
        ret = false;
    } finally {
        if (socket != null) {
             socket.close();
        }
    }

    return ret;
}

感谢您的宝贵时间!

最佳答案

我认为你的问题是你正在关闭实际的 DatagramSocket而不是重复使用相同的,只需调用 socket.send(DatagramPacket) 。如果您无法保持客户端套接字打开,那么您甚至可以定义客户端端口,例如: DatagramSocket clientSocket = new DatagramSocket(9743);所以每次你调用一个新的 clientSocket 时,它都会获得相同的端口,否则会抛出 java.net.BindException: Address already in use: Cannot bind

这不会解决网络 session 问题,因为您正在打开一个新的 UDP 套接字。另外我怀疑您的网络管理员看到了以前的 session ,因为您根本没有关闭 UDP 套接字,而只是生成它们

关于java - 在 udp 套接字上设置源端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40908561/

相关文章:

ruby - Ruby后台TCP服务器

java - 最小化通过 UDP 传输的数据的最有效方法是什么?

java - 如何从jsp文件中检索数据库中的数据?

java - 使用守护进程(jsvc)将资源文件添加到类路径

java - IBM Bluemix : Cant deploy dist to PaaS

java - 我可以用 sun.misc.Unsafe 覆盖对象吗?

java - Java错误: cannot find symbol

python - Unicode解码错误: 'utf-8' can't decode byte

c# - 在异步套接字中关闭套接字

java - 在 Java 中分配随机套接字时为什么要等待 `isBound`?