2016-12-01 2 views
0

여러 UDP 데이터 그램을 동일한 대상 IP 주소로 보내는 Java 응용 프로그램을 개발했습니다. 당연히 대상 포트는 항상 동일하지만 각 데이터 그램에서 동일하게 유지되도록 원본 포트를 설정할 수없는 것 같습니다.
전송하는 데이터 패키지가 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

hmmm 이전 UDP 소켓이 닫혀 있지 않은 시간에 포트가 변경되어 OS에서 새 연결을 열려고하므로 이전 포트를 아직 사용할 수 없으며 다음 사용 가능한 포트가 열립니다. 그게 당신 문제입니까? 왜냐하면 나는 클라이언트의 포트를 변경하는 다른 이유를 생각할 수 없기 때문입니다. 또한 '* 일단 새로운 데이터 패키지를 보내면 소스 포트가 변경됩니다 *'라는 것을 설명 할 수 있습니까? 어떻게 새 연결을 열려고합니까? 같은 실에서? 다른 프로세스에서 ?? 어떻게 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 소켓을 닫지 만, @AntJavaDev에서 언급 한 바와 같이 단순히

솔루션이었다 그들에게

+0

그냥 DatagramSocket 객체를 열어두고 socket.send (dp)를 호출하고 socket.close()를 주석 처리하여 다시 사용하려고했습니다. 여전히 동일한 동작입니다. 그것이 의미가 있기 때문에이 접근법에 희망이 조금있다. –

+0

당신은 소켓을 다시 열지 않습니까? 포트를 정의 할 수도 있습니까? – AntJavaDev

+0

그냥 소켓을 닫지 않고 원하는 포트를 지정하지 않아도 작동하도록 만들었습니다. 이제는 적절한 src 포트를 얻고 있습니다! –

0

원본 포트는 기본 네트워킹 구현에 의해 생성되는 임시 포트입니다. 특정 포트 번호로 설정할 이유가 없습니다.

+0

사실 나는 방금 방화벽 리소스의 2M 최대 세션 중 15 분마다 클라이언트 당 2K 세션을 먹고 있습니다. 우리는 1700 명의 고객이있는 대학에 있습니다. 모두가이 소프트웨어를 사용하기 시작하면 방화벽이 불안정해질 것입니다. –

+0

@CarlosAlbaladejo UDP 패킷마다 새 패킷을 만드는 대신 많은 UDP 패킷에 대해 동일한'InetSocketAddress' 객체를 사용 해보았습니까? –

0

산란되지 않기 때문에 네트워크 관리자가 이전 세션을보고 의심을 :

1.- DatagramSocket을 열어 두십시오. 2. 인수에 src 포트를 넘깁니다. 3. 동일한 목적지에 새로운 데이터 패킷이있을 때마다 닫히지 않은 DatagramSocket을 재사용하십시오!

감사합니다.