2016-12-01 46 views
0

我们开发了一个Java应用程序,它将几个UDP数据报发送到相同的目标IP地址。很显然,目标端口始终是同一个端口,但我们似乎无法将源端口设置为在每个数据报上保持不变。
如果我们发送的数据包比MTU更大的包被正确分裂在同一源端口,但是一旦我们发送一个新的数据包的源端口的变化,产生了新的防火墙会话(其中网络管理员已经警告我们要由于应用程序产生的会话数量非常差)。在udp套接字上设置源端口

现在,让我们用下面的语句发送包:

我们试过多种方法,结果总是相同的,我们似乎无法能够将源端口设置为固定值。

编辑 - 粘贴实际代码:

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; 
} 

感谢您的时间!

+0

嗯我想,在这之前的UDP套接字不紧密,所以操作系统正试图使先前端口尚不可用来打开一个新的连接,并打开了下一个可用的时间端口的变化。这是你的问题吗?因为我不能认为任何其他原因改变了客户端口。你也可以解释一下什么是'*,但是一旦我们发送一个新的数据包源端口改变*'意味着什么?你如何试图打开新的连接?在同一线程?在另一个过程中?你怎么关闭UDP套接字? – AntJavaDev

+0

还您对'DatagramPacket'类的初始化,那并不显得那么正确的......甚至不知道如果得到所有 – AntJavaDev

+0

的方式编制,以保持它总是相同的是始终从同一个插座发送,而不是显然每个请求创建一个新的套接字。 – EJP

回答

2

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

这不会解决网络会话问题,因为你正在打开一个新的UDP套接字。此外,我怀疑您的网络管理员,看到前几届会议,因为你没有关闭UDP套接字可言,而只是它们产卵

+0

试图离开DatagramSocket对象打开并重新使用它只是调用socket.send(dp)并注释掉socket.close()仍然是相同的行为。有一些希望在这种方法,因为它是有意义的 –

+0

你不重新打开插座?你是否也可以尝试定义端口? – AntJavaDev

+0

只是设法通过不关闭套接字和指定所需的端口,现在我得到正确的src端口! –

0

源端口是临时端口,由底层网络实现为您生成。没有理由将其设置为特定的端口号。

+0

其实我只是给你写过原因,我们在每个客户端每2M会话中每15分钟吃2K的会话。 我们在一所有1700个可访问客户的大学里,如果每个人都开始使用这个软件,我们会让防火墙变得不稳定。 –

+0

@CarlosAlbaladejo您是否曾尝试对多个UDP数据包使用相同的'InetSocketAddress'对象,而不是为每个UDP数据包创建一个新的。 –

0

正如@AntJavaDev提到

的解决方案是:

1.-保持DatagramSocket的开放 2:通源端口的参数 3.-重用未关闭DatagramSocket的每一个新的数据包到相同的目的地!

谢谢大家!